在我的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事件编写一个自定义函数,该事件又会为您调用这两个函数?如果您有两个功能,请从注册该事件的第三个脚本中调用它们。