Добавить несколько событий window.onload - PullRequest
58 голосов
/ 13 августа 2008

В моем пользовательском элементе управления ASP.NET я добавляю немного JavaScript в событие window.onload:

if (!Page.ClientScript.IsStartupScriptRegistered(this.GetType(), onloadScriptName))
  Page.ClientScript.RegisterStartupScript(this.GetType(), onloadScriptName, 
    "window.onload = function() {myFunction();};", true);            

Моя проблема в том, что если в событии * 1005 уже есть что-то, то это перезаписывает это. Как мне разрешить двум пользовательским элементам управления выполнять JavaScript в событии onload?

Редактировать: Спасибо за информацию о сторонних библиотеках. Я буду помнить их.

Ответы [ 10 ]

97 голосов
/ 27 марта 2009

Большинство предлагаемых «решений» относятся к Microsoft или требуют раздутых библиотек. Вот один хороший способ. Это работает с W3C-совместимыми браузерами и с Microsoft IE.

if (window.addEventListener) // W3C standard
{
  window.addEventListener('load', myFunction, false); // NB **not** 'onload'
} 
else if (window.attachEvent) // Microsoft
{
  window.attachEvent('onload', myFunction);
}
17 голосов
/ 13 августа 2008

Есть еще уродливое решение (которое намного хуже, чем использование фреймворка или addEventListener / attachEvent), которое заключается в сохранении текущего события onload:

function addOnLoad(fn)
{ 
   var old = window.onload;
   window.onload = function()
   {
       old();
       fn();
   };
}

addOnLoad(function()
{
   // your code here
});
addOnLoad(function()
{
   // your code here
});
addOnLoad(function()
{
   // your code here
});

Обратите внимание, что фреймворки, такие как jQuery, предоставляют способ выполнения кода, когда DOM готов, а не при загрузке страницы.

Готовность DOM означает, что ваш HTML загружен, но не внешние компоненты, такие как изображения или таблицы стилей, что позволяет вам вызываться задолго до того, как сработает событие загрузки.

4 голосов
/ 01 декабря 2010

У меня была похожая проблема сегодня, поэтому я решил ее, имея index.js со следующим:

window.onloadFuncs = [];

window.onload = function()
{
 for(var i in this.onloadFuncs)
 {
  this.onloadFuncs[i]();
 }
}

и в дополнительных js-файлах, которые я хочу прикрепить к событию onload, я просто должен сделать это:

window.onloadFuncs.push(function(){
 // code here
});

Я обычно использую jQuery, но на этот раз я ограничился только чисто js, который какое-то время заставлял меня думать!

3 голосов
/ 13 августа 2008

Mootools - еще одна замечательная среда JavaScript, которая довольно проста в использовании, и, как сказал RedWolves с jQuery , вы можете просто продолжать отбрасывать столько обработчиков, сколько захотите.

Для каждого файла * .js, который я включаю, я просто заключаю код в функцию.

window.addEvent('domready', function(){
    alert('Just put all your code here');
});

И есть также преимущества использования domready вместо onload

2 голосов
/ 13 августа 2008

Попробуйте это:

window.attachEvent("onload", myOtherFunctionToCall);

function myOtherFunctionToCall() {
    // do something
}

edit: эй, я только собирался войти в Firefox и переформатировать это сам! Похоже, мне не удается отформатировать код в IE7.

1 голос
/ 30 августа 2012

Вы можете сделать это с помощью jquery

$(window).load(function () {
    // jQuery functions to initialize after the page has loaded.
});
1 голос
/ 11 декабря 2008

Я знаю, что на это ответили, но я просто хочу, чтобы вы знали об этой функции:

http://phrogz.net/JS/AttachEvent_js.txt

С уважением, T

1 голос
/ 13 августа 2008

На самом деле, согласно этой странице MSDN , похоже, что вы можете вызывать эту функцию несколько раз, чтобы зарегистрировать несколько сценариев. Вам просто нужно использовать разные ключи (второй аргумент).

Page.ClientScript.RegisterStartupScript(
    this.GetType(), key1, function1, true);

Page.ClientScript.RegisterStartupScript(
    this.GetType(), key2, function2, true);

Я считаю, что это должно сработать.

1 голос
/ 13 августа 2008

Рассматривали ли вы использовать что-то вроде JQuery , которое обеспечивает основу для очистки добавления нескольких обработчиков событий?

1 голос
/ 13 августа 2008

Я не знаю много о ASP.NET, но почему бы не написать пользовательскую функцию для события onload, которая в свою очередь вызывает обе функции для вас? Если у вас есть две функции, вызовите их обе из третьего скрипта, который вы зарегистрировали для события.

...