Google Analytics мешает работе history.back() в браузере Android?

#javascript #android #html #google-analytics #android-browser

#javascript #Android #HTML #google-analytics #android-браузер

Вопрос:

У меня есть мобильное приложение html5, где все существует на одной странице, и я использую history.back / popstate / etc для изменения содержимого страницы (через jQuery Mobile). Я использую Google Analytics для отслеживания различных событий, и на одной странице я отслеживаю, выходит ли пользователь с помощью определенной кнопки:

 $('#my-back-button').bind('tap', function() {
    _gaq.push(['_trackEvent', 'mycategory', 'myaction']);
    history.back();
    return false;
});
  

В браузере Android 2.2 вызывается history.back(), но onpopstate не запускается, и страница не изменяется. Если я помещу window.onpopstate = function() { alert("!"); }; непосредственно перед history.back(), я не увижу предупреждения.

Если я поменяю местами две строки (сначала history.back(), затем _gaq.push), это, кажется, сработает, но я не могу полагаться на такой порядок во всем моем коде.

Исключения не генерируются. Это отлично работает в iOS и Chrome для настольных компьютеров.

Есть идеи, почему history.back() не работает после вызова Google analytics?

Комментарии:

1. У меня точно такая же проблема. Я не думаю, что вы нашли решение или обходной путь с момента первой публикации этого несколько месяцев назад, не так ли?

2. Извините, я не нашел обходного пути. В итоге мы просто перестали использовать google analytics и избегаем размещать код рядом с history.back().

3. Я не могу точно припомнить, чтобы у меня была такая же проблема, но, просматривая JavaScript для приложения HTML5, которое я создал (полтора года назад), я делегирую вызовы Google Analytics через функцию, которую я просто вызываю в конце других функций / вызовов, которым это нужно.

4. Использование window.onhashchange вместо window.onpopstate что-нибудь меняет? @RTB

Ответ №1:

Попробуйте перенести вызов в _ gaq.push() с таймаутом синхронизации 0:

 $('#my-back-button').bind('tap', function() {
    setTimeout(function() {
         _gaq.push(['_trackEvent', 'mycategory', 'myaction']);
    }, 0);
    history.back();
    return false;
});
  

Это позволит history.back() выполнить сначала, прежде чем Google Analytics потенциально повлияет на стек истории.

Комментарии:

1. У меня это работает, очень приятно. Может ли @DurhamG подтвердить, работает ли это и для него? Тогда я присужду вам бонус.

Ответ №2:

Хм, ладно, действительно неприятный вопрос: что произойдет, если вы обернете _gaq.push() в новую функцию и оставите history.go() там, где она есть?

Ответ №3:

Возможно, вызов Google analytics добавляет новую запись в стек истории, а history.back() просто возвращает вас на страницу, на которой вы находитесь в данный момент.

Или GA предоставляет новую область для истории.

Попробуйте дважды вызвать history.back() или использовать top.history.back() или window.history.back() или self.history.back()