66

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

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

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

编辑:感谢有关第三方库的信息。我会记住他们的。

4

8 回答 8

105

建议的大多数“解决方案”都是 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);
}
于 2009-03-27T01:34:31.973 回答
18

仍然有一个丑陋的解决方案(远不如使用框架或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 已加载,但未加载图像或样式表等外部组件,允许您在加载事件触发之前很久就被调用。

于 2008-08-13T13:44:52.163 回答
6

我今天遇到了类似的问题,所以我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 上,不得不暂时使用我的大脑!

于 2010-12-01T02:48:09.350 回答
3

Mootools是另一个很棒的 JavaScript 框架,它相当容易使用,就像 RedWolves 所说的使用jQuery一样,您可以继续使用任意数量的处理程序。

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

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

而且使用domready代替onload也有好处

于 2008-08-13T04:16:01.500 回答
2

试试这个:

window.attachEvent("onload", myOtherFunctionToCall);

function myOtherFunctionToCall() {
    // do something
}

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

于 2008-08-13T03:31:16.847 回答
1

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

于 2008-08-13T03:26:40.617 回答
1

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

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

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

我相信这应该有效。

于 2008-08-13T03:39:06.160 回答
1

你可以用jquery做到这一点

$(window).load(function () {
    // jQuery functions to initialize after the page has loaded.
});
于 2012-08-30T08:37:31.777 回答