添加多个window.onload事件

Ray*_*Ray 59 javascript asp.net events listener

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

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

我的问题是,如果onload事件中已经存在某些事情,那么这会覆盖它.如何在onload事件中允许两个用户控件执行JavaScript ?

编辑:感谢第三方库的信息.我会记住它们.

小智 97

建议的大多数"解决方案"都是特定于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);
}
Run Code Online (Sandbox Code Playgroud)


Vin*_*ert 17

还有一个丑陋的解决方案(远远不如使用框架或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
});
Run Code Online (Sandbox Code Playgroud)

请注意,像jQuery这样的框架将提供一种在DOM准备就绪时执行代码的方法,而不是在页面加载时执行代码.

DOM已准备好意味着您的HTML已加载但不包含外部组件(如图像或样式表),允许您在加载事件触发之前调用很长时间.


小智 6

我今天遇到了类似的问题,所以我解决index.js了以下问题:

window.onloadFuncs = [];

window.onload = function()
{
 for(var i in this.onloadFuncs)
 {
  this.onloadFuncs[i]();
 }
}
Run Code Online (Sandbox Code Playgroud)

在我想附加 onload 事件的其他 js 文件中,我只需要这样做:

window.onloadFuncs.push(function(){
 // code here
});
Run Code Online (Sandbox Code Playgroud)

虽然我通常使用 jQuery,但这次我被限制在纯 js 中,被迫使用我的大脑一段时间!