Не все счетчики одинаково просты. Например, для сбора статистики с помощью того же Google Analytics нам нужно загрузить целую библиотеку — файл urchin.js
или ga.js
. На наше счастье, конкретно в этом скрипте данные уже собираются с помощью создания динамической картинки.
Поэтому все, что нам требуется в том случае, если во внешней библиотеке находится мешающий нам вызов document.write
, — это заменить его соответствующим образом. Обычно для этого необходимо изменить сам JavaScript-файл. Не будем далеко ходить за материалом и рассмотрим преобразования на примере Omniture — довольно популярной на Западе библиотеки для сбора статистики.
Сначала нам нужно найти соответствующий участок кода внутри JavaScript-файла. В нашем случае это будет возвращаемая строка, которая затем вписывается в документ:
var s_code=s.t();if(s_code)document.write(s_code)
В коде Omniture достаточно найти соответствующий return
:
return '<im'+'g sr'+'c=" +"\"'+rs+'\" width=1 height=1 border=0 alt=\"\">'
и заменить его на следующий код (заметим, что для src
картинки берется переменная rs
):
return 'new Image(1,1).src=\"'+rs+'\"'
Затем мы уже можем заменить вызов и в самом HTML-файле на
var s_code=s.t();if(s_code)eval(s_code)
Для того чтобы все окончательно заработало, необходимо заменить в файле s_code.js
и остальные вызовы document.write
(всего их там два). Выглядит это примерно так:
var c=s.t();if(c)s.d.write(c); ... s.d.write('<im'+'g name=\"'+imn+" +"'\" height=1 width=1 border=0 alt=\"\">');
меняем на
var c=s.t();if(c)eval(c); ... new Image(1,1).name=imn;
Внимательные читатели уже заметили, что альтернативой document.write
в нашем случае стал eval
, что по большому счету не очень хорошо. Однако здесь не ставится задачи перебирать конкретный скрипт «по косточкам», чтобы избавиться от такого костыля. В некоторых случаях стоит ограничиться просто уверенностью, что вся остальная логика останется нетронутой после вмешательств, ибо все изменения касались только отправки собираемых данных на сервер.