<?xml version="1.0" encoding="UTF-8" ?><oembed><version>1.0</version><provider_name>Чудо{вищные} заметки</provider_name><provider_url>https://miracle.rpz.name</provider_url><author_name>MiRacLe</author_name><author_url>https://miracle.rpz.name/author/miracle/</author_url><title>Счётчики и onload events</title><html>На страницах сайтов &lt;strike&gt;частенько&lt;/strike&gt; почти всегда приходиться ставить счётчики различных бесплатных (и платных тоже) online-статистик, а так же нередко нужно поставить onload-handler на window (выпадающее меню, или нечто подобное требующее инициализации после полной загрузки страницы)... Ну приходиться и приходиться, проблема-то в чём? А проблема в том, что картинки(в данном случае изображения счётчиков) могут грузиться неимоверно долго(иногда, если сервер хотлога &lt;em&gt;(например хотлога - намеренно никого не обижаем ;o) ) &lt;/em&gt;не доступен(занят) это занимает порядка 60-секунд(или сколько там таймаут в браузере ?!?), соответственно пока не произойдёт таймаут (не загрузиться изображение) &lt;strong&gt;window.onload&lt;/strong&gt; не сработает.... Дошли руки наконец искоренить (хотя бы частично) эту &quot;проблему&quot;... - &lt;strong&gt;грузить счётчик после полной загрузки страницы&lt;/strong&gt;
&lt;blockquote&gt;(да часть хитов возможно не попадут в статистику, но есть мнение, что пользователи [сужу по себе] и так не дожидаются полной загрузки &quot;тормозных&quot; страниц - либо уходят, потому что страница не интересна[раздражает тормознутостью],либо жмут Stop[продвинутые Esc] и продолжают работать )&lt;/blockquote&gt;Так что теряем (если теряем) теоритически по минимому. Итак : Вместо счётчика делаем картинку (я сделал прозрачный однопиксельный gif) размером точно под счётчик (для того чтобы после загрузки счётчика не &quot;расползалась вёрстка&quot;) (как правило 88x31) и даём ей id=&quot;counter_id&quot; (для того чтобы позже найти её):
&lt;blockquote&gt;&lt;a href=&quot;http://free-online-statistics.example.com&quot; &gt;&lt;img src=&quot;/images/1x1.gif&quot; border=&quot;0&quot; width=&quot;88&quot; height=&quot;31&quot; id=&quot;counter_id&quot; /&gt; &lt;/a&gt;&lt;/blockquote&gt;в js-скрипт пишем функцию:
&lt;pre class=&quot;js:nocontrols&quot;&gt;
function doLoadCounter() {
   var url=&quot;http://free-online-statistics.example.com/counter.script&quot;;
   var query_string = &quot;&quot;;
   // тут долго-долго собираем query_string (как правило нужно просто скопировать код счётчика и выбрать нужные параметры и убрать document.write(code) )
   // var s=screen;
   // var px=(ie==1)?s.colorDepth:s.pixelDepth;
   // query_string += px;
   var counterImg = new Image();
   counterImg.src = url + query_string;
   counterImg.onload = function() {
      var placeHolder = document.getElementById(&#039;counter_id&#039;);
      if (placeHolder) {
         placeHolder.src = this.src;
      }
   }
}
&lt;/pre&gt;
Далее рисуем что-то типа:
&lt;pre class=&quot;js:nocontrols&quot;&gt;addOnLoadEvent(doLoadCounter);&lt;/pre&gt;
эта функция была &quot;сочинена&quot; по мотивам &lt;a title=&quot;Назначение нескольких обработчиков для одного события&quot; href=&quot;http://xpoint.ru/know-how/JavaScript/PoleznyieFunktsii?28#ObrabotkaSobyitiy&quot;&gt;БазыЗнанийXpoint&lt;/a&gt; её смысл - &quot;навесить&quot; обработчик load на window (или document - зависит от браузера) удобна как раз в том случае если их(обработчиков) надо иметь более одного (о чём я толкую уже 39-ю строчку)
&lt;pre class=&quot;js&quot;&gt;
function addOnLoadEvent() { 
  var root = window.addEventListener || window.attachEvent ? window : document.addEventListener ? document : null;
  if (root) { 
     for (var i = 0; i &lt; arguments.length; i++) { 
        if (&#039;function&#039; == typeof(arguments[i])) addHandler(root,&#039;load&#039;,arguments[i]);
     }
  }
}
&lt;/pre&gt;Определение addHandler взято по ссылке выше...
&lt;pre class=&quot;js&quot;&gt;
function addHandler(object, event, handler) {
   if (typeof (object.addEventListener) != &#039;undefined&#039;)
       object.addEventListener(event, handler, false);
   else if (typeof (object.attachEvent) != &#039;undefined&#039;)
      object.attachEvent(&#039;on&#039; + event, handler);
   else {
      var handlersProp = &#039;_handlerStack_&#039; + event;
      var eventProp = &#039;on&#039; + event;
      if (typeof (object[handlersProp]) == &#039;undefined&#039;) {
         object[handlersProp] = [];
         if (typeof (object[eventProp]) != &#039;undefined&#039;)
            object[handlersProp].push(object[eventProp]);
         object[eventProp] = function(e) {
            var ret = true;
            for (var i = 0; ret != false &amp;&amp; i &lt; object[handlersProp].length; i++)
               ret = object[handlersProp][i](e);
            return ret;
         }
       }
       object[handlersProp].push(handler);
    }
}
&lt;/pre&gt;
&lt;p&gt;В итоге имеем: &lt;/p&gt;
&lt;p&gt;1. Загружается страница, css, js, сопутствующие картинки с сайта &lt;br /&gt;2. Выполняется js. &lt;br /&gt;3. Срабатывает onload event &lt;br /&gt;4. Страница &quot;готова к употреблению&quot; - всякие менюшки и прочие &quot;прибамбасы&quot; уже работают &lt;br /&gt;5. Загружается счётчик &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;P.S.&lt;/strong&gt; &lt;br /&gt;Наслышан о том что есть системы &quot;запрещающие&quot; редактировать код своих счётчиков…&lt;br /&gt;хммм... не знаю как они проверяют &quot;это дело&quot; - по идее &quot;запрос картинки&quot; прозрачен для сервера (не важно как этот запрос сформирован), возможно выборочно-ручные &quot;проверки на вшивость&quot;... но думаю даже в таких &quot;тяжёлых&quot; случаях всегда можно найти выход - отказаться от этого счётчика или объяснить причину &quot;переделок&quot; владельцам системы…&lt;/p&gt;</html><type>rich</type></oembed>