关于javascript:添加多个window.onload事件

关于javascript:添加多个window.onload事件

Add multiple window.onload events

在我的ASP.NET用户控件中,我向window.onload事件添加了一些JavaScript:

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

我的问题是,如果onload事件中已经存在某些内容,那么它将覆盖它。我该如何允许两个用户控件在onload事件中分别执行JavaScript?

编辑:感谢您提供有关第三方库的信息。我会牢记在心的。


建议的大多数"解决方案"是特定于Microsoft的,或者需要使用膨胀的库。这是一种好方法。这适用于W3C兼容的浏览器和Microsoft IE。

1
2
3
4
5
6
7
8
if (window.addEventListener) // W3C standard
{
  window.addEventListener('load', myFunction, false); // NB **not** 'onload'
}
else if (window.attachEvent) // Microsoft
{
  window.attachEvent('onload', myFunction);
}

还有一个丑陋的解决方案(不如使用框架或addEventListener / attachEvent逊色)来保存当前的onload事件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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已加载,但未加载图像或样式表之类的外部组件,从而使您可以在加载事件触发之前很久就被调用。


我今天有一个类似的问题,所以我解决了一个index.js的问题:

1
2
3
4
5
6
7
8
9
window.onloadFuncs = [];

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

以及我要附加onload事件的其他js文件,我只需要这样做:

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

虽然我通常使用jQuery,但是这次我只限于纯粹的js,被迫花了一段时间!


Mootools是另一个很好用的JavaScript框架,就像RedWolves用jQuery所说的那样,您可以随心所欲地处理尽可能多的处理程序。

对于每个包含的* .js文件,我只是将代码package在一个函数中。

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

还有使用domready代替onload

的优点


尝试一下:

1
2
3
4
5
window.attachEvent("onload", myOtherFunctionToCall);

function myOtherFunctionToCall() {
    // do something
}

edit:嘿,我刚刚准备好使用Firefox登录并自己重新格式化!似乎仍然无法使用IE7为我设置代码格式。


您可以使用jquery

执行此操作

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

实际上,根据此MSDN页面,您似乎可以多次调用此函数来注册多个脚本。您只需要使用不同的键(第二个参数)。

1
2
3
4
5
Page.ClientScript.RegisterStartupScript(
    this.GetType(), key1, function1, true);

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

我认为应该可以。


我对ASP.NET不太了解,但是为什么不为onload事件编写一个自定义函数,该事件又会为您调用这两个函数?如果您有两个功能,请从注册该事件的第三个脚本中调用它们。


推荐阅读