添加到窗口.onload事件
adding to window.onload event?
我想知道如何添加另一个方法调用的窗口。Onload事件被分配了一个方法调用
假设在脚本的某个地方我有这个分配…
window.onload = function(){ some_methods_1() };
然后在脚本中我有这个赋值
window.onload = function(){ some_methods_2() };
目前,只调用some_methods_2
。有没有办法在不取消some_methods_1
的情况下增加之前的window.onload
回调?(也不包括some_methods_1()
和some_methods_2()
在同一功能块)。
我想这个问题不是真的关于window.onload
,而是一个关于javascript的问题。我不想给window.onload
分配这样一种方式,如果另一个开发人员在脚本上工作,并添加一段代码,也使用window.onload
(不看我以前的代码),他会禁用我的onload事件。
我也想知道同样的事情关于
$(document).ready()
在jquery 。我怎样才能在不破坏之前或之后的东西的情况下增加它呢?
如果使用jQuery,则无需做任何特殊操作。通过$(document).ready()
添加的处理程序不会相互覆盖,而是依次执行:
$(document).ready(func1)
...
$(document).ready(func2)
如果你不使用jQuery,你可以使用addEventListener
,如Karaxuna所示,加上attachEvent
的IE<9。
注意onload
不等同于$(document).ready()
-前者等待CSS,图像…而后者只等待DOM树。现代浏览器(以及IE9以后的IE)支持文档上的DOMContentLoaded
事件,它对应于jQuery的ready
事件,但IE9不支持。
if(window.addEventListener){
window.addEventListener('load', func1)
}else{
window.attachEvent('onload', func1)
}
...
if(window.addEventListener){
window.addEventListener('load', func2)
}else{
window.attachEvent('onload', func2)
}
如果两个选项都不可用(例如,您不处理DOM节点),您仍然可以这样做(我使用onload
作为示例,但其他选项可用于onload
):
var oldOnload1=window.onload;
window.onload=function(){
oldOnload1 && oldOnload1();
func1();
}
...
var oldOnload2=window.onload;
window.onload=function(){
oldOnload2 && oldOnload2();
func2();
}
或者,为了避免污染全局命名空间(并可能遇到命名空间冲突),使用import/export IIFE模式:
window.onload=(function(oldLoad){
return function(){
oldLoad && oldLoad();
func1();
}
})(window.onload)
...
window.onload=(function(oldLoad){
return function(){
oldLoad && oldLoad();
func2();
}
})(window.onload)
你可以使用attachEvent(ie8)和addEventListener来代替
addEvent(window, 'load', function(){ some_methods_1() });
addEvent(window, 'load', function(){ some_methods_2() });
function addEvent(element, eventName, fn) {
if (element.addEventListener)
element.addEventListener(eventName, fn, false);
else if (element.attachEvent)
element.attachEvent('on' + eventName, fn);
}
基本上有两种方法
-
存储
window.onload
的前一个值,以便您的代码可以在代码执行之前或之后调用前一个处理程序 -
使用
addEventListener
方法(当然Microsoft不喜欢并要求您使用另一个不同的名称)。
如果另一个脚本想要使用window.onload
并且不考虑合作,第二个方法将给你更多的安全,但Javascript的主要假设是所有脚本都将像你试图做的那样合作。
请注意,一个不被设计为与其他未知脚本一起工作的坏脚本总是能够破坏页面,例如,通过混淆原型,通过污染全局命名空间或损坏dom。
这可能不是一个流行的选择,但有时脚本最终以各种块分发,在这种情况下,我发现这是一个快速修复
if(window.onload != null){var f1 = window.onload;}
window.onload=function(){
//do something
if(f1!=null){f1();}
}
然后在别的地方…
if(window.onload != null){var f2 = window.onload;}
window.onload=function(){
//do something else
if(f2!=null){f2();}
}
这将根据需要更新onload函数和链
一个纯JavaScript(非jQuery)方法,它不会覆盖现有的onload事件,而是添加到它,将是:
window.addEventListener('load', function() {
// do your things here
}
- JavaScript-动态SVG-onload属性-未触发事件
- image.onload事件和浏览器缓存
- 无法将java脚本函数与Panel'绑定;s OnLoad事件
- Jquery:如何动态绑定带有onload事件的文本框
- 如何使用body onload事件操作HTML音频标记和JavaScript函数
- “;预加载“;<音频>影响window.onload事件时间
- 如何在动态插入的html文件中使用onload事件
- CRM 2013-引用子记录的Javascript表单警报(onload事件)
- 在Firefox for Android的onload事件中,window.innerWidth的值错误
- 如何在 iFrame 的 onload 事件中执行代码
- 如何使标头动画仅在javascript中显示onload事件(不允许jQuery)
- iframe 中的 onload 事件仅触发一次
- 在文档准备就绪之前,Javascript onload 事件和其他事件
- 使用 onLoad 事件提高前端性能
- 我应该使用window.onload事件吗?
- 尝试在 jquery .load(“myHTML.html”) 上触发正文 'onLoad' 事件
- JavaScript OnLoad 事件不会在 iPhone 上触发
- iframe上的onload事件在IE和Firefox / GoogleChrome中的工作方式不同
- window.onload 事件不会触发或“如何正确初始化 js 项目?”
- 如果不在 onLoad 函数中,jQuery 事件处理程序不起作用