Счетчик для сложной статистики от mail.ru или как удалось увеличить отзывчивость страинцы

Аватар пользователя Demimurych Demimurych 29 ноября 2008 в 14:29

Один из моих знакомый обратился ко мне за советов в такой проблеме. На сайте использовался счетчик от mail.ru. Причем сложная форма этого счетчика которая предоставляет расширенную статистику посещения сайта. Установив это счетчик на свои страницы, знакомый обнаружил, что зачастую отзывчивость страниц упала в разы. То что открывалось за миллисекунды стало зависать порой на две три и больше секунд.

Вот пример кода счетчика (взят с чужого сайта)

<!--Rating@Mail.ru COUNTEr--><script language="JavaScript" type="text/javascript"><!--
d=document;var a='';a+=';r='+escape(d.referrer)
js=10//--></script><script language="JavaScript1.1" type="text/javascript"><!--
a+=';j='+navigator.javaEnabled()
js=11//--></script><script language="JavaScript1.2" type="text/javascript"><!--
s=screen;a+=';s='+s.width+'*'+s.height
a+=';d='+(s.colorDepth?s.colorDepth:s.pixelDepth)
js=12//--></script><script language="JavaScript1.3" type="text/javascript"><!--
js=13//--></script><script language="JavaScript" type="text/javascript"><!--
d.write('<a href="http://top.mail.ru/jump?from=1233906"'+
' target=_top><img src="http://d3.cd.b2.a1.top.mail.ru/counter'+
'?id=1233906;t=94;js='+js+a+';rand='+Math.random()+
'" alt="РейтингMail.ru"'+' border=0 height=1 width=1/><\/a><br>')
if(11<js)d.write('<'+'!-- ')//--></script><noscript><a
target=_top href="http://top.mail.ru/jump?from=1233906"><img
src="http://d3.cd.b2.a1.top.mail.ru/counter?js=na;id=1233906;t=94"
border=0 height=1 width=1
alt="РейтингMail.ru"/></a><br></noscript><script language="JavaScript"
type="text/javascript"><!--
if(11<js)d.write('--'+'>')//--></script><!--/COUNTER-->

очевидно что торможения вызывает вот этот запрос

d.write('<a href="http://top.mail.ru/jump?from=1233906"'+
' target=_top><img src="http://d3.cd.b2.a1.top.mail.ru/counter'+
'?id=1233906;t=94;js='+js+a+';rand='+Math.random()+
'" alt="РейтингMail.ru"'+' border=0 height=1 width=1/><\/a><br>')

Выйти из положения удалось просто. Счетчик был переделан в такой вид

<!--Rating@Mail.ru COUNTEr--><script language="JavaScript" type="text/javascript"><!--
d=document;var a='';a+=';r='+escape(d.referrer)
js=10//--></script><script language="JavaScript1.1" type="text/javascript"><!--
a+=';j='+navigator.javaEnabled()
js=11//--></script><script language="JavaScript1.2" type="text/javascript"><!--
s=screen;a+=';s='+s.width+'*'+s.height
a+=';d='+(s.colorDepth?s.colorDepth:s.pixelDepth)
js=12//--></script><script language="JavaScript1.3" type="text/javascript"><!--
js=13//--></script><noscript><a
target=_top href="http://top.mail.ru/jump?from=1233906"><img
src="http://d3.cd.b2.a1.top.mail.ru/counter?js=na;id=1233906;t=94"
border=0 height=1 width=1
alt="РейтингMail.ru"/></a><br></noscript><!--/COUNTER-->

<div id='counter_mail_ru'></div>
<script type='text/javascript'>
$(document).ready(function()
{
setTimeout(function(){
$('#counter_mail_ru').html('<a href="http://top.mail.ru/jump?from=1233906"'+
' target=_top><img src="http://d3.cd.b2.a1.top.mail.ru/counter'+
'?id=1233906;t=94;js='+js+a+';rand='+Math.random()+
'" alt="РейтингMail.ru"'+' border=0 height=1 width=1/><\/a><br>');
 },1000);

});
</script>

То есть идея в том что саму строку запроса к счетчику добавлять к странице уже после того как страница сформирована. Иначе говоря, сначала пользователь видит страницу, и параллельно добавляется счетчик. Который в такой последовательности уже не влияет на время отклика страницы.

Обратите внимание что строка добавляется по истечении 1000 милисекунд после того как сформировано DOM дерево. Казалось бы зачем.
Дело в том, что в некоторых бразуерах document ready выззывается еще до того страница отображена на экране. Почему я не разобрался. В результате я добавил задержку, не обходимую чтобы браузер успел показать страницу.

Быть может есть какое то более элегантное решение проблемы. Хотелось бы его узнать.

Комментарии

Аватар пользователя Demimurych Demimurych 29 ноября 2008 в 17:52

"EllECTRONC" wrote:
А мыльница позволяет изменять код + на результаты статистики это не влияет?

Они предупреждают что при изменении кода не гарантируют точность статистики.
Фактически код оставлен тот же, изменена логика его подключения.

Этот код стоит два дня, пока статистика судя по предыдущим периодам считается правильно.

Аватар пользователя SkyD SkyD 17 января 2010 в 19:22

В первую очередь хочу поблагодарить за рассказ о решении актуальной проблемы - насколько я заметил, счётчик Мэйл.ру тормозит и сейчас (год+ спустя).

Я тоже собираюсь поставить на сайт счётчик Mail.ru, но тот, по которому ранжируются сайты в их рейтинге (top.mail.ru)
(правда пока не знаю тот же ли это счётчик, что упоминается здесь)

У меня пара вопросов:

1) Могли бы вы чуть более подробно (для полных dumbass в Javascript) пояснить как именно надо редактировать код?

Просто обернуть тормозящий кусок в указанную ниже конструкцию?

setTimeout(function(){
$('#counter_mail_ru').html(' --КОД-- ');
 },1000);

2) С кодом счётчика РейтингMail.ru (top.mail.ru) возможен аналогичный приём?
(это вопрос уже скорее к пользователям Рейтинга)

Аватар пользователя ilnarb ilnarb 26 марта 2010 в 16:36

интересное решение.
но будет терять хиты:
- пользователей с отключенным javascript
- пользователей пришедших ненадолго -- например, не успеет сработает ваш таймаут

что касается того что $(document).ready вызывается рано -- оно вызывается после сформирования DOM, а не после загрузки страницы.
если хотите после загрузки, то вызывайте вставку на onload тега body