Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果多个脚本设置window.onload,会发生什么情况?_Javascript_Onload - Fatal编程技术网

Javascript 如果多个脚本设置window.onload,会发生什么情况?

Javascript 如果多个脚本设置window.onload,会发生什么情况?,javascript,onload,Javascript,Onload,在StackOverflow和其他网站上有很多关于避免名称空间冲突的帖子。在我的场景中,我只希望在DOM可访问之后执行JavaScript中的一个方法 如果我执行以下操作,它会避免名称空间冲突吗 <script type="text/javascript">window.onload = function() { //Define my namespace var here, and execute all my code }</script> window.onloa

在StackOverflow和其他网站上有很多关于避免名称空间冲突的帖子。在我的场景中,我只希望在DOM可访问之后执行JavaScript中的一个方法

如果我执行以下操作,它会避免名称空间冲突吗

<script type="text/javascript">window.onload = function() { //Define my namespace var here, and execute all my code }</script>
window.onload=function(){//在此处定义我的命名空间变量,并执行我的所有代码}
如果稍后注入的脚本也设置了onload函数呢?我的会被覆盖吗?我完全知道我可以测试这一点,但我也希望得到一些反馈,因为我是JavaScript新手,可能还有很多其他场景可以做一些我不知道的事情


编辑:我只需要支持Safari 5.0+

是的,最后一个将覆盖以前的


解决方案:使用新的事件API:。

这是一种很好的Javascript方法

function addLoadEvent(func) {
 var oldonload = window.onload;
 if (typeof window.onload != 'function') {
    window.onload = func;
 } else {
    window.onload = function() {
    if (oldonload) {
      oldonload();
    }
    func();
   }
 }
}
addLoadEvent(nameOfSomeFunctionToRunOnPageLoad);
addLoadEvent(function() {
   /* more code to run on page load */
});

关于这方面有很多信息,但这里有一个简短的版本:

如果你想很好地玩onload,你可以这样做

var prev_onLoad = window.onload;
window.onload = function() {
    if (typeof(prev_onLoad)=='function')
        prev_onLoad();

    // rest of your onLoad handler goes here
}
希望其他人玩得很好,或者确保这是代码中最后一个onload设置

然而,更现代的浏览器具有事件注册功能(IE上的addEventListener和attachEvent),这些功能除其他功能外,还负责此链接。已经编写了相当多的跨浏览器onload事件函数,它们为您处理此逻辑。

它将被覆盖。 在Javascript中,当您定义事件句柄时

window.onload = function(){
   console.log("in Load function 1");

};
window.onload = function(){
  console.log(" In load function 2");
};
这将生成一个“assign”window.onload=>function()。和window.onload将分配给最后一个函数

但是在jQuery中, 您可以多次处理事件,浏览器将使所有

$("body").on("click",function(){
console.log("make a callback function 1");
});
$("body").on("click",function(){
console.log("make a callback function 2");
});
因为jQuery使回调不是“赋值”。
希望它能帮助你。

@Oriol是对的。既然你是新来的。。。让你的生活变得轻松。。。使用JQuery。别误会我。。。学习JavaScript,但使用JQueryOff主题学习它:请注意,如果您只想等待DOM就绪,则应收听
DOMContentLoaded
,而不是
load
,后者将等待图像加载。addEventListener将无法与IE一起使用。如前所述,除非有特殊原因不使用jQuery,否则请使用jQuery$(window).on(“load”,function(){})@MaksymKozlenko不会只在IE的旧版本上工作,现在IE的使用率非常低。你认为每个人都应该使用jQuery,但是其他人(比如我)喜欢其他框架,比如惊人的快速。汇编语言编写代码也比较快,但是我们中的大多数人都使用高级语言,如C++或JavaScript。纯JS对于简单的事情来说很好,但是当你的应用程序增长时,你需要使用一些框架来使你的代码模块化。不幸的是,旧的IE 7和8仍然是一个问题,因为一些公司的IT部门懒得升级Windows或使用其他更符合标准的浏览器:-(问题是,如果asker无法控制脚本,它将不会使用此代码,并将重写其事件侦听器。