JS: прикрепить тело к кроссбраузерной загрузке (сравнение методов)

#javascript

#javascript

Вопрос:

Я изучил сообщение Дина Эдварда onload и у меня вопрос: что не так с этим onload методом прикрепления? Где и почему это может привести к сбою? И когда безопасно использовать эту более простую функцию?

 function addLoadEvent(func){
    var oldonload = window.onload;
    if(typeof window.onload != 'function'){
        window.onload = func;
    }else{
        window.onload = function(){
            oldonload();
            func();
        }
    }
}
 

Комментарии:

1. это просто цепочка. Для использования нескольких обработчиков

Ответ №1:

Суть сообщения Дина не в том, как перехватить window.load событие, а в том, как перехватить полезное событие до window.load . window.load происходит очень, очень поздно в цикле загрузки страницы (после полной загрузки всех ресурсов, включая все изображения). Если на вашей странице есть какие-либо значительные ресурсы, и вы ждете, пока window.load не подключите свои обработчики событий, ваши пользователи, скорее всего, начнут что-то делать до того, как будут подключены ваши обработчики.

Обратите внимание, что статья Дина была написана в 2006 году. Современная практика заключается в том, чтобы просто поместить ваш скрипт непосредственно перед закрывающим </body> тегом. Пока ваш скрипт находится после любых элементов, на которые он ссылается, элементы будут доступны для вас. Таким образом, вы действительно подключаете вещи очень рано.

Пример (живая копия):

HTML:

 <p>This page has a big image on it, to help demonstrate
  <code>window.load</code>'s very late arrival.
  Note that this paragraph started out black, but was
  turned green <em>immediately</em> on page load.
  This demonstrates that the paragraph was available
  to the code at the end of the page.
</p>
<img src="http://apod.nasa.gov/apod/image/1110/sh2136s_block900.jpg" style="position: absolute; top: 20em;">
 

JavaScript (непосредственно перед </body> конечным тегом):

 (function() {
  var first;

  function hookLoad(handler) {
    if (window.addEventListener) {
      window.addEventListener("load", handler, false);
    }
    else if (window.attachEvent) {
      window.attachEvent("onload", handler);
    }
  }

  display("Script running at end of page; turning paragraph green.");
  document.getElementsByTagName('p')[0].style.color = "green";

  hookLoad(function() {
    display("First load handler");
  });

  hookLoad(function() {
    display("Second load handler");
  });

  function display(msg) {
    var p = document.createElement('p'),
        now = new Date().getTime();
    msg = now   ": "   msg;
    if (first) {
      msg  = " (delayed by "   (now - first)   "ms)";
    }
    else {
      first = now;
    }
    p.innerHTML = msg;
    document.body.appendChild(p);
  }
})();
 

Если вы по какой-то причине не можете этого сделать (поместить скрипт в конец body элемента), тогда такие приемы, как Dean’s, начинают быть полезными, но я бы настоятельно рекомендовал не использовать обработку «DOM loaded» самостоятельно; вместо этого используйте хорошую, хорошо поддерживаемую библиотеку, такую как jQuery, Prototype, YUI,или любой из нескольких других и используйте их «готовое» событие. Используя текущую работу, проделанную в этих библиотеках, вы можете вместо этого сосредоточиться на том, что вы пытаетесь сделать со своей собственной страницей / приложением.


Ссылки:


[ window.load В частности: вам не нужно прибегать к вашему трюку, просто используйте addEventListener (если браузер поддерживает его, все делают, кроме более старых версий IE) или attachEvent (более старый IE). Смотрите hookLoad в примере выше. Они допускают несколько обработчиков для события.]