I’e been attempting to get Google Analytics to work correctly in both FireFox and IE6 for a site at $WORK. This is not normally a problem, apart from the fact that we’re serving up pages to firefox as application/xhtml+xml
in order to get MathML support.
Now, the sample code from Google is pretty gnarly.
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); try{ var pageTracker = _gat._getTracker("UA-xxxxxx-x"); pageTracker._trackPageview(); } catch(err) {}
This fails in XHTML as document.write() isn’t there.
I tried a number of ways to get this to work.
- Replace
document.write()
with some jQuery code to insert a script tag.- This didn’t work in IE6 — as the second script block ended up getting called before newly inserted script tag had loaded.
- But I did find out that jQuery will replace script tags with Ajax calls for you. Which means you don’t end up with a script tag in the DOM tree, which is highly confusing when you’re looking for it in firebug.
- Replace
document.write()
with native DOM calls to insert a script tag.- I did find the neat idea of adding an id to the script tag you’re currently in, so you know where to insert new DOM elements.
- But it still failed, and for the same reason as above.
I was just about to start implementing something evil involving setInterval()
, when I realised…
… this site will never use SSL!
So I replaced the code to generate a script tag with the script tag.
http://www.google-analytics.com/ga.js try{ var pageTracker = _gat._getTracker("UA-xxxxxx-x"); pageTracker._trackPageview(); } catch(err) {}
Tada! If only I’d thought of this a few hours earlier… The moral is to be more aware of the context in which you’re doing something. Keep an eye on the “big picture” to use a particularly horrible metaphor.