gpt4 book ai didi

javascript - 添加多个 onload 处理程序

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:19:34 26 4
gpt4 key购买 nike

我有两个 js 文件,每个文件都有自己的 window.onload 处理程序。根据我将两个 onload 处理程序附加到窗口对象的方式,我在第二个处理程序上得到不同的行为。

更具体地说,这是我的 html 文件:

<html>
<head>
<title>Welcome to our site</title>
<script type="text/javascript" src="script1.js"> </script>
<script type="text/javascript" src="script2.js"> </script>
</head>
<body id="pageBody">
<h2 align="center">
<a href="http://www.whatever.com" id="redirect"> Wellcome to our site... c'mon in! </a>
</h2>
</body>
</html>

它加载了两个 js 文件,script1.js 和 script2.js。

这是导致(至少对我而言)意外行为的这两个脚本的版本。

脚本 1.js:

window.onload = initAll1(); // attach first onload handler

function initAll1() {
alert("initAll1");
document.getElementById("redirect").onclick = foo; // attach an onclick handler
}

function foo() {
alert("we are in foo");
return false;
}

脚本2.js:

addOnloadHandler(initAll2); // with this we should attach a second onload handler

function initAll2() {
alert("initAll2");
if (linkHasOnclickHandler(document.getElementById("redirect"))) {
alert("correct!");
}
else {
alert("wrong!");
}
}

function addOnloadHandler (newFunction) {
var oldevent = window.onload;
if (typeof oldevent == "function") {
window.onload = function() {
if (oldevent) {
oldevent();
}
newFunction();
};
}
else {
window.onload = newFunction;
}
}

function linkHasOnclickHandler() {
var oldevent = document.getElementById("redirect").onclick;
if (typeof oldevent == "function") {
return true;
}
else {
return false;
}
}

在 Script2.js 中,我尝试使用函数 addOnloadHandler() 以一种很好的非侵入式方式添加第二个 onload 处理程序。此函数不假设是否已经有任何 onload 处理程序附加到窗口对象。它是非侵入性的,因为它应该添加新的处理程序而不删除以前的处理程序。

问题是当使用 addOnloadHandler() 加载时,initAll2() 无法检测到 document.getElementById("redirect") 已经将 foo() 作为 onclick 事件处理程序附加(参见 initAll1()) .警告信息“错误!”被触发,这对我来说似乎是错误的行为。

当我忘记 addOnloadHandler() 并使用以下方法在 Script1.js 中附加两个 onload 处理程序时:

window.onload = function () {initAll1(); initAll2();};

然后一切都按预期工作,initAll2() 启动“正确!”警报消息。

addOnloadHandler()有问题吗?有人能让它工作吗?我真的很想用它来代替第二种方法。

谢谢!

最佳答案

以防万一 future 的人发现这一点,并且正在寻找一种方法来在对象本身不支持 addEventListenerattachEvent 或其他一些时使用多个事件处理程序监听器堆叠的形式——即它是一个定制对象,实现不佳。然后您可以执行以下操作:

object.onload = (function(pre){
return function(){
pre && pre.apply(this,arguments);
/// do what you need for your listener here
}
})(object.onload);

每次你使用上面的代码时,之前的 onload 监听器都会作为参数传入,当你的新监听器被触发时,它会首先运行旧的监听器 - 这意味着你可以像这样堆叠许多监听器, 如果您愿意。但是,这仅适用于始终使用上述代码向您的对象添加监听器的情况。如果在其他地方用简单的方法覆盖它,您所有的辛勤工作都将付诸东流:

object.onload = function(){}

请注意,如果您要实现库、插件或构造函数,其他编码人员可能会接手您的工作。拜托,请为多个事件监听器编写代码。 真的没那么难。

关于javascript - 添加多个 onload 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4558325/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com