2011-04-28 93 views
0

我有一個需要用肢體的onload事件JavaScript的衝突全身多處的onload事件,必須先在

它應該是簡單的解決方案多javasripts - 只需添加所有事件行是這樣的:

<body onload="showContent(); 
    randomImages(); 
    placeIt(); 
    showIt(); 
    preloadImgs(); 
    initialize()"> 

但當然生活並不那麼簡單.. 出於某種原因一些腳本需要排在第一位。因此,如果我先將showContent();放入,randomimages將不會執行,反之亦然。

我也試圖與腳本替代onload事件這樣

if (typeof window.addEventListener != "undefined") 
    window.addEventListener("load", showContent, false); 
else if (typeof window.attachEvent != "undefined") { 
    window.attachEvent("onload", showContent); 
} 
else { 
    if (window.onload != null) { 
     var oldOnload = window.onload; 
     window.onload = function (e) { 
      oldOnload(e); 
      showContent(); 
     }; 
    } 
    else 
     window.onload = showContent; 
} 

到目前爲止,我有這個矛盾沒有解決方案。有人有好主意嗎?

+0

如果函數不拋出錯誤,它們將被順序執行。所以我假設'showContent'在某種程度上失敗了,阻止了以下的執行。 – 2011-04-28 09:53:49

回答

0

爲什麼不創建另一個函數來保存所有這些函數,然後在加載時調用該函數?這假設你的函數沒有其他函數的依賴。

showContent();randomImages();placeIt();showIt();preloadImgs();initialize() 

可以是多一點有組織的位置:

function Init() 
{ 
     showContent(); // if this errors out, execution for the rest stops 
     randomImages(); 
     placeIt(); 
     showIt(); 
     preloadImgs(); 
     initialize(); 
} 
0

@Felix克林你是部分正確的,那麼它們就順序,但每個功能的執行時間會有所不同發起的,因此有可能創建一個競爭條件,序列中的最後一個函數可以完成之前序列中的第一個完成。

這個問題的答案是建立在你的函數回調。然後你可以對它們進行排序,只有當前一個函數完成時纔會調用後續函數。 關於這個問題here有一個很好的答案。

不過我還有一點。儘量避免使用Body Onload組合,而是使用Jquery的document .ready()函數。這是因爲Body Onload可以在加載所有內容之前觸發 - 我認爲這在JQuery網站here上有更好的解釋。

+0

實際上$(document).ready比body.onload更早觸發。 onload事件將在加載圖像時觸發。 jquery文檔就緒在加載DOM時觸發,並且可以安全地操作。這意味着腳本可以在圖像加載的同時運行,從而使網站的加載速度更快。 – Marcus 2012-03-12 08:21:00