2011-11-12 18 views
7

Ho un'app html5 mobile in cui tutto esiste su una singola pagina e utilizzo history.back/popstate/etc per modificare il contenuto della pagina (tramite jQuery Mobile). Sto utilizzando Google Analytics per monitorare vari eventi, e in una sola pagina ho monitorare se le uscite utente tramite un pulsante particolare:Google Analytics interferisce con history.back() nel browser Android?

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

In Android 2.2 del browser history.back() viene chiamato, ma non viene generato onpopstate e la pagina non è cambiata. Se inserisco window.onpopstate = function() { alert("!"); }; appena prima di history.back(), non vedo alcun avviso.

Se inverto le due righe (history.back() prima, quindi _gaq.push), sembra funzionare, ma non posso fare affidamento su questo tipo di ordinamento nel mio codice.

Nessuna eccezione viene lanciata. Funziona bene su iOS e sul desktop Chrome.

Qualche idea sul perché history.back() non funzioni dopo una chiamata di google analytics?

+0

Ho lo stesso identico problema. Non credo che tu abbia trovato una soluzione o una soluzione alternativa dal primo post di questo mese fa, vero? – Trott

+0

Non ho trovato un rimedio spiacente. Alla fine abbiamo semplicemente smesso di utilizzare google analytics e evitiamo di inserire il codice vicino a history.back(). – DurhamG

+0

Non riesco a ricordare specificamente di avere lo stesso problema, ma guardando attraverso il JavaScript per un'app HTML5 che ho creato (anno e mezzo fa ora), delegare le chiamate a Google Analytics attraverso una funzione che ho appena chiamato alla fine di altre funzioni/chiamate che ne hanno bisogno. – cchana

risposta

1

Hm, ok, davvero uno sgradevole: cosa succede se si avvolge _gaq.push() in una nuova funzione e si lascia history.go() esattamente dove si trova?

1

Forse la chiamata a google analytics aggiunge una nuova voce allo stack della cronologia e history.back() ti porta semplicemente alla pagina che sei al momento.

Oppure GA offre un nuovo ambito alla cronologia.

Prova a chiamare history.back() due volte o utilizzare top.history.back() o window.history.back() o self.history.back()

2

Prova avvolgendo la chiamata a _ gaq.push() in un asincrona timeout di 0:

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

Questo permetterà history.back() per eseguire prima di Google Analytics influisce potenzialmente lo stack storia.

+0

Questo funziona per me, molto bello. @DurhamG può confermare se funziona anche per lui? Allora ti assegnerò il bonus. – RTB

Problemi correlati