添加多个window.onload事件

时间:2008-08-13 03:18:33

标签: 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);            

我的问题是,如果onload事件中已存在某些内容,则会覆盖它。如何在onload事件中允许两个用户控件执行JavaScript?

修改:感谢您提供有关第三方库的信息。我会记住它们。

10 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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
});

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

DOM准备就绪意味着你的HTML已经加载但没有加载外部组件,如图像或样式表,允许你在加载事件触发之前很久就被调用。

答案 2 :(得分:4)

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

window.onloadFuncs = [];

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

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

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

我通常使用jQuery,但这次我被限制为纯粹的js,被迫使用我的思想一段时间!

答案 3 :(得分:3)

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

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

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

还有advantages of using domready instead of onload

答案 4 :(得分:2)

试试这个:

window.attachEvent("onload", myOtherFunctionToCall);

function myOtherFunctionToCall() {
    // do something
}

编辑:嘿,我刚准备好用Firefox登录并自行重新格式化!似乎仍然没有为IE7格式化代码。

答案 5 :(得分:1)

我知道这已经得到了解答,但我只是想让你知道这个功能:

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

关于T

答案 6 :(得分:1)

您可以使用jquery

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

答案 7 :(得分:1)

我对ASP.NET知之甚少,但为什么不为onload事件编写自定义函数,而后者又为你调用这两个函数?如果您有两个函数,请从注册该事件的第三个脚本中调用它们。

答案 8 :(得分:1)

您是否考虑使用类似JQuery的内容来提供清除添加多个事件处理程序的框架?

答案 9 :(得分:1)

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

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

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

我相信这应该有效。