#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()