2013-07-20 26 views
0

晚上好。setimeout後的removeChild - 零星工作?

我有一個加載器覆蓋站點,通過css轉換(不透明)淡出,當body類更改爲「加載」時持續1000ms,然後一旦轉換完成,我將它從DOM。

我正在使用以下腳本,在任何情況下都能正常工作bar osx snow leopard/google chrome v28,甚至只有幾個人 - 我的設置完全相同,我的客戶和幾乎所有人我可以去測試 - 並且它工作正常。

但是,我已經有2或3個錯誤報告,其中加載程序沒有從DOM中刪除,所以它仍然覆蓋其餘內容,並使其下的元素無法點擊。一類用戶甚至給我發送了一個視頻,確認加載程序元素仍在DOM中。

該腳本如下所示;我想知道是否可能有問題,或者我已經刪除了元素,或者使用了setTimeout函數語法本身。

任何幫助,爲什麼這可能會失敗,將不勝感激,特別是考慮到我無法複製這個!我在腳本中添加了一些評論,以解釋我期望它如何工作(以及它的大部分工作方式)。

var 
loaded = false, 
_body = document.body, 
loader = document.getElementById("loader"), 
kill_loader = function() { 
    if (loader) { 
     loader.parentNode.removeChild(loader); 
    } 
}, 
cl = function() { 
    // set loaded to true, add class to body that fades the loader, then remove the loader 
    loaded = true; 
    _body.className = _body.className + " loaded"; 
    // the above works as intended 
    setTimeout(kill_loader,1000); 
    // this last bit does not seem to work in rare instances as detailed. 
    // the timeout is so that the loader fully fades before being removed. 
}; 

window.onload = function() { 
    if (!loaded) { 
    // if loaded variable is false (i.e. cl() has not run), call the function to complete loading 
     cl(); 
    } 
}; 


setTimeout(function() { 
    // if page still not loaded after 5 seconds, force the load 
    if(!loaded) { 
     cl(); 
    } 
},5000); 

非常感謝您提供給您的任何幫助。

+0

如果你不能複製它,你可以讓你的用戶報告任何控制檯錯誤嗎?你的變量是全局的嗎? –

+1

...這不是直接相關的,但作爲一種形式,我會將你的'if(!loaded){'移動到'cl()'函數,以便不必重複它。然後你可以做'window.onload = cl'和'setTimeout(cl,5000)' –

+0

這段代碼是否準備好了?我想知道如果問題可能是「loader」在您調用該函數時爲null,因爲在某些奇怪的情況下,html還沒有呈現。該頁面上的腳本在哪裏?它在html之後嗎? –

回答

0

確定該解決方案與我的腳本本身無關,但是由於安裝了Chrome插件(measureIt.js)而導致我的腳本無法使用。輝煌。

我已成功安裝了插件並且添加了一個簡單的try catch語句來刪除加載程序,以便複製問題(不限於OSX或chrome版本)。

感謝Crazy Train幫助我整理語法 - 它讓問題更容易一些。