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

Как добавить дополнительное событие window.onload в Javascript

В моем пользовательском элементе управления asp.net я добавляю несколько script к событию window.onload, например:

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

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

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

4b9b3361

Ответ 1

Большинство предлагаемых решений являются специфичными для 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);
}

Ответ 2

По-прежнему существует уродливое решение (которое намного хуже, чем использование фреймворка или 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 загружен, но не внешние компоненты, такие как изображения или таблицы стилей, что позволяет вам вызывать задолго до возникновения события загрузки.

Ответ 3

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

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

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

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

Ответ 4

У меня была аналогичная проблема сегодня, поэтому я решил ее иметь 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, которые были вынуждены использовать мой разум на некоторое время!

Ответ 5

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

Ответ 6

Попробуйте следующее:

window.attachEvent("onload", myOtherFunctionToCall);

function myOtherFunctionToCall() {
    // do something
}

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

Ответ 7

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

Ответ 8

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

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

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

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

Ответ 9

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

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

относится к T

Ответ 10

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

$(window).load(function () {
    // jQuery functions to initialize after the page has loaded.
});