Подтвердить что ты не робот

Лучшая практика использования window.onload

Я разрабатываю веб-сайты/компоненты/модули и плагины Joomla, и так часто мне требуется возможность использовать JavaScript, который запускает событие при загрузке страницы. Большую часть времени это выполняется с помощью функции window.onload.

Мой вопрос:

  • Это лучший способ вызвать события JavaScript при загрузке страницы или есть лучший/более новый способ?
  • Если это единственный способ инициировать событие при загрузке страницы, что лучший способ убедиться, что несколько событий могут выполняться разными скриптами?
4b9b3361

Ответ 1

window.onload = function(){}; работает, но, как вы могли заметить, , вы можете указать только 1 прослушиватель.

Я бы сказал, что лучший/более новый способ сделать это - использовать фреймворк или просто использовать простую реализацию родных методов addEventListener и attachEvent (для IE), что позволяет вам удалите слушателей и для событий.

Здесь кросс-браузерная реализация:

// Cross-browser implementation of element.addEventListener()
function listen(evnt, elem, func) {
    if (elem.addEventListener)  // W3C DOM
        elem.addEventListener(evnt,func,false);
    else if (elem.attachEvent) { // IE DOM
         var r = elem.attachEvent("on"+evnt, func);
         return r;
    }
    else window.alert('I\'m sorry Dave, I\'m afraid I can\'t do that.');
}

// Use: listen("event name", elem, func);

Для случая window.onload используйте: listen("load", window, function() { });


EDIT. Я хотел бы расширить свой ответ, добавив ценную информацию, на которую указывали другие.

Речь идет о DOMContentLoaded (в настоящее время поддерживаются ночные часы Mozilla, Opera и webkit) и события onreadystatechange (для IE), которые могут быть применены к объект document, чтобы понять, когда документ доступен для управления (не дожидаясь загрузки всех изображений/таблиц стилей и т.д.).

Существует много "хакерских" реализаций для поддержки кросс-браузеров, поэтому я настоятельно рекомендую использовать фреймворк для этой функции.

Ответ 2

Современные фреймворки javascript представили идею "документа, готового" к событию. Это событие, которое будет срабатывать, когда документ готов к выполнению DOM-манипуляций. Событие "onload" срабатывает только после того, как ВСЕ на странице загрузилось.

Наряду с событием "document ready", фреймворки предоставили возможность поставить в очередь несколько бит кода и функций Javascript для запуска при возникновении события.

Итак, если вы не согласны с фреймворками, лучший способ сделать это - реализовать свою собственную очередь document.onload.

Если вы не возражаете против фреймворков, тогда вы захотите изучить jQuery и document.ready, Prototype и dom: загружен, Dojo и addOnLoad или Google для [ваши рамки] и "документ готов",

Если вы не выбрали фреймворк, но заинтересованы, jQuery - хорошее место для начала. Он не меняет никакой функциональности Javascript, и, как правило, будет оставаться на вашем пути и позволит вам делать то, что вам нравится, когда захотите.

Ответ 3

События window.onload переопределяются в нескольких творениях. Для добавления функций используйте window.addEventListener(стандарт W3C) или window.attachEvent(для IE). Используйте следующий код, который сработал.

if (window.addEventListener) // W3C standard
{
  window.addEventListener('load', myFunction, false); // NB **not** 'onload'
} 
else if (window.attachEvent) // Microsoft
{
  window.attachEvent('onload', myFunction);
}

Ответ 4

Joomla поставляется с MooTools, поэтому вам будет проще использовать библиотеку MooTools для вашего дополнительного кода. MooTools поставляется с настраиваемым событием с именем domready, которое запускается при загрузке страницы и анализируется дерево документа.

window.addEvent( domready, function() { code to execute on load here } );

Более подробную информацию о MooTools можно найти здесь. Joomla 1.5 в настоящее время поставляется с MT1.1, в то время как Joomla 1.6 alpha будет включать MT1.2

Ответ 5

Лично я предпочитаю этот метод. Он не только позволяет вам иметь несколько функций onload, но если какой-то script определил его до, вам это удалось, этот метод достаточно хорош, чтобы справиться с этим... Единственная проблема left - если страница загружает несколько script, которые не используют функцию window.addLoad(); но это их проблема:).

P.S. Это также здорово, если вы хотите позже "увеличить" функции.

Ответ 6

Это грязный, но более короткий путь: P

function load(){
   *code*
}

window[ addEventListener ? 'addEventListener' : 'attachEvent' ]
( addEventListener ? 'load' : 'onload', function(){} )

Ответ 7

По состоянию на я всегда включаю файлы JSuery/bootstrap JS внизу документа и не имею доступа к $ по документу, я разработал крошечный "init" -плагин, который является одним и только JS script, который я включаю в себя вверху моих страниц:

window.init = new function() {
    var list = [];

    this.push = function(callback) {
        if (typeof window.jQuery !== "undefined") {
            callback();
        } else {
            list.push(callback);
        }
    };

    this.run = function() {

        if (typeof window.jQuery !== "undefined") {
            for(var i in list) {
                try {
                    list[i]();
                } catch (ex) {
                    console.error(ex);
                }
            }
            list = [];
        }
    };

    if (window.addEventListener) {
        window.addEventListener("load", this.run, false);
    } else if (window.attachEvent) {
        window.attachEvent("onload", this.run);
    } else {
        if (window.onload && window.onload !== this.run) {
            this.push(window.onload);
        }
        window.onload = this.run;
    }
};

Используя это, я могу определить любой анонимный загрузчик над страницей, перед включением jQuery и bootstrap, и не забудьте, что он будет срабатывать, когда присутствует jQuery:

init.push(function() {

    $('[name="date"]').datepicker({
        endDate: '0d',
        format: 'yyyy-mm-dd',
        autoclose: true
    }).on('hide', function() {
        // $.ajax
    });

    $('[name="keyword_id"]').select2();
});