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

Добавление в событие window.onload?

Мне интересно, как добавить другой вызов метода в событие window.onload, как только он уже был назначен вызов метода.

Предположим, что где-то в script у меня есть это назначение...

 window.onload = function(){ some_methods_1() };

а затем в script у меня есть это назначение

 window.onload = function(){ some_methods_2() };

В его нынешнем виде будет вызываться только some_methods_2. Есть ли способ добавить к предыдущему обратному вызову window.onload без отмены some_methods_1? (а также без включения как some_methods_1(), так и some_methods_2() в тот же функциональный блок).

Я думаю, этот вопрос не о window.onload, а о javascript вообще. Я НЕ хочу что-то присваивать window.onload таким образом, что если бы другой разработчик работал над script и добавлял кусок кода, который также использует window.onload (не глядя на мой предыдущий код) он отключит мое событие onload.

Мне также интересно то же самое о

  $(document).ready()

в jquery. Как я могу добавить к нему, не разрушая то, что было раньше, или что может произойти после?

4b9b3361

Ответ 1

Если вы используете jQuery, вам не нужно ничего делать. Обработчики, добавленные с помощью $(document).ready(), не перезаписывают друг друга, а выполняют по очереди:

$(document).ready(func1)
...
$(document).ready(func2)

Если вы не используете jQuery, вы можете использовать addEventListener, как продемонстрировал Karaxuna, плюс attachEvent для IE < 9.

Обратите внимание, что onload не эквивалентно $(document).ready() - первый ожидает CSS, изображения... также, в то время как последний ожидает только дерева DOM. Современные браузеры (и IE с IE9) поддерживают DOMContentLoaded событие в документе, которое соответствует событию jQuery ready, но IE < 9 нет.

if(window.addEventListener){
  window.addEventListener('load', func1)
}else{
  window.attachEvent('onload', func1)
}
...
if(window.addEventListener){
  window.addEventListener('load', func2)
}else{
  window.attachEvent('onload', func2)
}

Если ни один из параметров не доступен (например, вы не имеете дело с узлами DOM), вы все равно можете это сделать (я использую onload в качестве примера, но для onload) доступны другие параметры:

var oldOnload1=window.onload;
window.onload=function(){
  oldOnload1 && oldOnload1();
  func1();
}
...
var oldOnload2=window.onload;
window.onload=function(){
  oldOnload2 && oldOnload2();
  func2();
}

или, чтобы избежать загрязнения глобального пространства имен (и, вероятно, столкновения с пространствами имен), используя шаблон импорта/экспорта IIFE:

window.onload=(function(oldLoad){
  return function(){
    oldLoad && oldLoad();
    func1();
  }
})(window.onload)
...
window.onload=(function(oldLoad){
  return function(){
    oldLoad && oldLoad();
    func2();
  }
})(window.onload)

Ответ 2

Вместо этого вы можете использовать attachEvent (ie8) и addEventListener

addEvent(window, 'load', function(){ some_methods_1() });
addEvent(window, 'load', function(){ some_methods_2() });

function addEvent(element, eventName, fn) {
    if (element.addEventListener)
        element.addEventListener(eventName, fn, false);
    else if (element.attachEvent)
        element.attachEvent('on' + eventName, fn);
}

Ответ 3

Есть в основном два пути

  • сохранить предыдущее значение window.onload, чтобы ваш код мог вызывать предыдущий обработчик, если он присутствует до или после выполнения кода

  • с использованием подхода addEventListener (конечно, Microsoft не любит и требует, чтобы вы использовали другое имя).

Второй способ даст вам немного больше безопасности, если другой script хочет использовать window.onload и делает это, не думая о сотрудничестве, но основное предположение для Javascript заключается в том, что все скрипты будут взаимодействовать, как вы пытаетесь сделать.

Обратите внимание, что плохой script, который не предназначен для работы с другими неизвестными сценариями, всегда сможет сломать страницу, например, путем возиться с прототипами, загрязняя глобальное пространство имен или повреждая dom.

Ответ 4

Это может быть не популярный вариант, но иногда сценарии в конечном итоге распространяются в разных кусках, в этом случае я нашел, что это быстрое исправление

if(window.onload != null){var f1 = window.onload;}
window.onload=function(){
    //do something

    if(f1!=null){f1();}
}

затем где-то еще...

if(window.onload != null){var f2 = window.onload;}
window.onload=function(){
    //do something else

    if(f2!=null){f2();}
}

это обновит функцию onload и цепь по мере необходимости