У меня есть два js-файла, каждый со своим обработчиком window.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.
Вот версия этих двух сценариев, которая приводит к (по крайней мере, мне) неожиданному поведению.
Script1.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;
}
Script2.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 (). Эта функция не делает никаких предположений относительно того, есть ли уже какой-либо обработчик загрузки, присоединенный к объекту окна. Он неинвазивен, поскольку должен добавлять новый обработчик, не удаляя предыдущие.
Дело в том, что при загрузке с помощью addOnloadHandler () initAll2 () не может обнаружить тот факт, что document.getElementById («redirect») уже имеет функцию foo (), присоединенную в качестве обработчика события onclick (см. InitAll1 ()) , Предупреждение "неправильно!" срабатывает, что мне кажется неправильным поведением.
Когда я забываю о addOnloadHandler () и присоединяю оба обработчика загрузки в Script1.js, используя:
window.onload = function () {initAll1(); initAll2();};
тогда все работает как положено, и initAll2 () запускает «правильно!» предупреждающее сообщение.
Что-то не так с addOnloadHandler ()? Кто-нибудь может заставить это работать? Я бы очень хотел использовать его вместо второго метода.
Спасибо!