2011-04-08 84 views
5

我有幾個函數應該在onload事件延遲後觸發。它在Chrome中運行正常,但不在Firefox中運行。如何在一段時間後在window.onload中加載javascript函數

function foo() { 
    // javascript code 
} 

window.onload = setTimeout(foo, delay); 

function bar() { 
    // javascript code 
} 

window.onload = setTimeout(bar, delay); 

如果我刪除了延遲,'bar'在Firefox中被調用,'foo'和'bar'在chrome中被調用。這裏可能是什麼問題?

回答

1

嘗試包裹超時的功能:

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

@Koooilnc感謝您的提示。你能告訴我們如何動態地做到這一點,因爲基於一些命名約定,單選按鈕中的所有項目通常都有一個javascript函數(例如,我可能有2個,3個或4個或多個選項)。 – Achaius 2011-04-08 11:19:24

+0

@Kalpana不知道你的意思:'window.onload = [somefunction]'表示:在文件加載後啓動'somefunction'。之後,您可以使用單選按鈕等功能。如果您希望它們通過某個「延遲」觸發頁面重新加載,您可以嘗試在html中添加一個參數('thisorthat.html?delay = 10')。搜索的方式來使用參數,大量的答案被發現。 – KooiInc 2011-04-08 11:34:39

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); 
}; 
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); 
     } 
    } 

希望它能幫助。

+1

函數數組的想法非常整齊。如果你添加了一些'var arr = [];'和'arr.push(a); arr.push(b);'這將是完美的:) – 2011-04-08 12:07:11

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年開始更新,所以我會確保它正常工作在最新的瀏覽器。

相關問題