Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> .load(), jquery 1.9.1, IE8 и яндекс-метрика, получаю ошибку в скрипте метрики 
V
    Опции темы
Чoо
Дата 5.7.2013, 02:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: нет
Всего: 4



Здравствуйте. Задача состоит в следующем: необходимо при клике по ссылкам, находящимся в блоке div#menu_X загрузить страницу в блок div#ajax_content_X div.for_ajax. В загружаемой странице нужная секция находится в блоке div.for_ajax.

Имею вышеперечисленное и в секции head:
Код

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript" src="design/scripts/load_ajax.jQuery.js"></script>
<script>
    $(document).ready(function(){
        $('#ajax_content_a').ajax_load_pages({
            'containerdiv': '#ajax_content_a',
            'contentdiv': '.for_ajax',
            'idlinks': '#menu_a a'
        });
        $('#ajax_content_b').ajax_load_pages({
            'containerdiv': '#ajax_content_b',
            'contentdiv': '.for_ajax',
            'idlinks': '#menu_b a'
        });
    });
</script>

содержимое load_ajax.jQuery.js:
Код

(function( $ ) { 
    var defaults = {
        containerdiv: '#ajax-content',
        contentdiv : '.for_ajax',
        idlinks: '#menu-ajax a'    
    };
    
    $.fn.ajax_load_pages = function(params){
     var options = $.extend({}, defaults, params);
        $(options.idlinks).click(function(e){
         var link = this.href;
         $(options.containerdiv).animate({opacity:0},function(){
             $(options.containerdiv).load(link+" "+options.contentdiv,function(){
                 $(options.containerdiv).animate({opacity:1});
             });
         });
         e.preventDefault();
        });        
        return this;
    };    
})(jQuery);

код счетчика от яндекс-метрики:
Код

<!-- Yandex.Metrika counter -->
<div style="display:none;"><script type="text/javascript">
(function(w, c) {
    (w[c] = w[c] || []).push(function() {
        try {
            w.yaCounterXXXXXXX = new Ya.Metrika({id:XXXXXXX, enableAll: true});
        }
        catch(e) { }
    });
})(window, "yandex_metrika_callbacks");
</script></div>
<script src="//mc.yandex.ru/metrika/watch.js" type="text/javascript" defer="defer"></script>
<noscript><div><img src="//mc.yandex.ru/watch/XXXXXXX" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter -->

запрашиваемую страницу вывожу в эту конструкцию(при клике по ссылкам в ней же):
Код

    <div id="menu_a">
        <a href=%link%>%text%</a>
        <a href=%link%>%text%</a>
        <a href=%link%>%text%</a>
        <a href=%link%>%text%</a>
        <a href=%link%>%text%</a>
        <a href=%link%>%text%</a>
        <div id="ajax_content_a">
            <div class="for_ajax">
                <!-- СЮДА ВЫВОДИТСЯ ЗАПРАШИВАЕМАЯ СТРАНИЦА -->
            </div>
        </div>
    </div>

в запрашиваемой странице нужный участок размещен в блоке:
Код

<!-- ... -->
            <div class="for_ajax">
                <!-- от сюда берем нужную часть-->
            </div>
<!-- ... -->


Содержимое, вобщем-то, получаю.. но вместе с тем в IE8 получаю сообщение:
Код

 Строка: 39
Ошибка: 'navigator.userAgent' -  есть null или не является объектом
 (watch.js).
Обе страницы находятся в пределах одного домена. На двух же страницах установлен одинаковый счетчик. Если убрать счетчик с запрашиваемой .load() страницы - ошибка не наблюдается. Но это не решение - счетчик там нужен..
Подскажите пожалуйста, как решить эту проблему?


Это сообщение отредактировал(а) Чoо - 5.7.2013, 02:46


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
ksnk
Дата 5.7.2013, 07:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 38
Всего: 386



Загружаемые страницы - в принципе - самостоятельные страницы сайта? Счетчик метрики там нужен именно по этому? Может не выводить его при генерации страниц, запрашиваемых по ajax? Так как получается, что на одной и той же странице(url остается таким же) вызывается метрика несколько раз. Yandex может неправильно понять.

Как вариант, если до генерации страниц добраться сложно, можно переписать 
Код

$.fn.ajax_load_pages = function(params){
     var options = $.extend({}, defaults, params);
        $(options.idlinks).click(function(e){
         var link = this.href;
         $(options.containerdiv).animate({opacity:0},function(){

             // $.ajax вместо load
             $.ajax({
                url:link+" "+options.contentdiv,
                success: function(data){
                    data=data.replace(/<!-- Yandex\.Metrika[\n\r.]*/Yandex\.Metrika counter -->/,'')
                    $(options.containerdiv).html(data);
                    $(options.containerdiv).animate({opacity:1});
                }
             })
         });
         e.preventDefault();
        });        
        return this;
    };  


Это сообщение отредактировал(а) ksnk - 5.7.2013, 07:23


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Чoо
Дата 5.7.2013, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: нет
Всего: 4



ksnk, спасибо за ответ.
Загружаемые страницы - самостоятельные (на них можно попасть и на прямую), поэтому счетчик там нужен.
К сожалению, с .ajax() та же ошибка (правда немного изменил код):
Код

    $.fn.ajax_load_pages = function(params){
         var options = $.extend({}, defaults, params);
            $(options.idlinks).click(function(e){
             var link = this.href;
             $(options.containerdiv).animate({opacity:0},function(){
                 $.ajax({
                        url:link, //в функции .load() можно было в адресе через пробел указать селектор, с которого забирается содержимое.
                        success: function(data){
                                data=data.replace(/<!-- Yandex\.Metrika[\n\r.]*\/Yandex\.Metrika counter -->/,''); //забекспейсил слеш
                                    $(options.containerdiv+">"+options.contentdiv).html($(options.contentdiv, data).html());     
                                   //^^забираю из .contentdiv запрашиваемой страницы
                            $(options.containerdiv).animate({opacity:1});
                        }
                     })
             });
             e.preventDefault();
            });        
            return this;
        };

получаю в ИЕ ту же ошибку:
http://s018.radikal.ru/i526/1307/af/b08d572a9631.png
в страницу до переделки функции и после вставляется часть страницы без счетчика. но он все-таки как-то влияет на процесс
ошибка проявляет себя при клике по ссылке. после нее уже отрабатывает функция.

***
ставлю точки останова в watch.js на первой строке и в load_ajax.jQuery.js на var link = this.href; - в ff останавливается на метрике, в IE останавливается в load_ajax.jQuery.js

Это сообщение отредактировал(а) Чoо - 5.7.2013, 13:11


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Чoо
Дата 5.7.2013, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: нет
Всего: 4



ну вобщем причина, по которой поведение не поменялось - под регулярное выражение попадала только строка 
Код

<!-- Yandex Metrika counter -->

соответственно код счетчика оставался. как сделать, что бы затереть весь блок - я не сообразил, поэтому просто вставил открытый комментарий
Код

data=data.replace(/<!--\sYandex\.Metrika\scounter\s-->/,'$&<!--');

но кажется, что это не совсем изящно)


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
ksnk
Дата 5.7.2013, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 38
Всего: 386



Да, в регулярке косяк. Причем, скорее в реализации регулярок в JS вообще... 
Должно быть так.
Код

data=data.replace(/<!--\s*Yandex\.Metrika(\n|\r|.)*?\/Yandex\.Metrika\s*counter -->/g,'')

Вот кто мне объяснит, почему перечисление тут работает, а перечисление символов, которое работает, к примеру, в php, тут не пашет?

Это сообщение отредактировал(а) ksnk - 5.7.2013, 20:15


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Чoо
Дата 5.7.2013, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: нет
Всего: 4



ksnk, я и не заметил, что перечисление не пашет. переписанный вариант работает. спасибо за помощь.

***
спецсимвол ? можно, наверное, не использовать?. Жадный поиск, благодаря ограничителю 
Код

\/Yandex\.Metrika\s*counter -->

"съедает" все между комментов.
***



--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Применение библиотек | Следующая тема »


 




[ Время генерации скрипта: 0.0879 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.