5

我有几个函数应该在 onload 事件延迟后触发。它在 chrome 中运行良好,但在 Firefox 中运行良好。

function foo() {
    // javascript code
}

window.onload = setTimeout(foo, delay);

function bar() {
    // javascript code
}

window.onload = setTimeout(bar, delay);

如果我删除延迟,“bar”会在 Firefox 中调用,“foo”和“bar”会在 chrome 中调用。这里可能是什么问题?

4

4 回答 4

4

我很惊讶这两个函数都在任何浏览器中被调用。但是您可能会遇到更好的运气,例如:

function foo() {
    // javascript code
    setTimeout(bar, additionalDelay);
}

function bar() {
    // javascript code
}

window.onload = function() { setTimeout(foo, delay); };

编辑:没关系,我明白为什么两个超时都会执行。当您执行以下操作时:

window.onload = setTimeout(bar, delay);

...您实际上并没有设置window.onload在延迟后执行您的功能。相反,这是立即调用setTimeout()以安排您的函数调用,并将结果(调度函数调用的句柄)分配给window.onload. 这是不正确的,并且在某些浏览器尝试window.onload作为函数调用时可能会导致运行时错误。

您想要做的是将函数分配给window.onload,例如:

window.onload = function() { 
    setTimeout(foo, delay); 
    setTimeout(bar, delay);
};
于 2011-04-08T11:10:40.160 回答
3

你可以像这样使用 jQuery:

$(document).ready(function() { /* your code */ });

或者

$(window).load(function() { /* your code */ });

jQuery 会自动将函数添加到堆栈中,并在事件触发后将它们全部运行。

如果你只想用 JS 来做,你可以创建一个函数数组来触发:

function a() {
        alert('a');
    }

    function b() {
        alert('b');
    }

    var arr = new Array(a, b);

    window.onload = function() {
        for(var i = 0; i < arr.length; i++) {
            setTimeout(arr[i], 1000);
        }
    }

希望能帮助到你。

于 2011-04-08T11:29:20.200 回答
1

尝试将超时包装在一个函数中:

window.onload = function(delay) {
                  setTimeout(foo, delay); 
                  setTimeout(bar, delay); 
                };
于 2011-04-08T11:09:39.897 回答
1

我可以在您的代码中看到两个基本错误。首先,如果你想传递一个函数作为参数,你需要写出不带括号的函数名;如果您添加括号,则该函数将立即执行。看一个例子:

function foo(){
    alert("I am foo");
}
function bar(){
    alert("I am bar");
}

setTimeout(foo, 5000);
setTimeout(bar(), 10000);

其次,如果您.onload使用运算符为属性分配值,=您将覆盖其先前的值,就像a = 3覆盖先前的值一样a

function foo(){
    alert("I am foo");
}
function bar(){
    alert("I am bar");
}
window.onload = foo;
window.onload = bar;

据我所知,您的主要问题是能够添加而不是替换事件处理程序。像往常一样,没有可以在所有浏览器中安全使用的通用 API。如果您使用的是框架或库,它可能提供了跨浏览器机制。否则,您需要自己查找或编写。过去,我在几个项目中使用过它:

...虽然它自 2005 年以来没有更新,所以我会确保它在最近的浏览器中正常工作。

于 2011-04-08T11:52:38.643 回答