我已經寫了一個CSS和Javascript lazyloader動態加載單獨pagelets的資源(以Facebook用BigPipe技術呈現頁面的方式)。如何只在IE中等待document.readyState並立即啓動所有其他瀏覽器?
簡而言之,首先呈現HTML框架,然後頁面的單獨部分全部由服務器異步生成。當每個小頁面到達時,首先加載小頁面css,然後設置其innerHTML,最後我們爲這個小頁面加載任何必需的javascript並初始化它。
一切工作完美,感知的加載時間對於任何給定的頁面來說都是非常瞬時的。
但是在IE中,我偶爾會在初始化腳本時得到Method does not support method or property
。
我已經通過在加載腳本之前檢查document.readyState來解決此問題。
現在這不是一個大問題,但它平均增加了一個頁面加載在Chrome或Firefox的170毫秒。這是不需要的。
function loadScripts(init){
// ensure document readystate is complete before loading scripts
if(doc.readyState !== 'complete'){
setTimeout(function(){
loadScripts(init);
}, 1);
}
else{
complete++;
if(complete == instance.length){
var scripts = checkJS(javascript);
if(scripts.length) {
LazyLoad.js(scripts, function(){
runPageletScript();
for (var i = 0; i < scripts.length; ++i) {
TC.loadedJS.push(scripts[i]);
}
});
}
else{
runPageletScript();
}
}
}
}
我所尋找的是該腳本將只實現在IE的「等待」,如果是其他任何瀏覽器,它只會火馬上修改。我無法使用像$.Browser
這樣的jQuery實用程序,並且需要它成爲最小的可能方法。我討厭使用任何形式的瀏覽器檢測,但它看起來好像它是我唯一的解決方案。這就是說,如果任何人都可以用另一種方式想出來,那就太棒了。
任何建議將受到感謝。
這是一個奇妙的方法。我甚至從來不知道這在IE中存在。不幸的是,你發佈的代碼在IE中失敗......這可能是一個簡單的錯誤,我會通過你提供的鏈接並找出問題出在哪裏。如果可行,這將是一個完美的解決方案。你知道這是否會在谷歌關閉時正確縮小? – gordyr 2013-05-14 11:06:33
對不起 - 我會看到我出錯的地方。另外Closure Compiler可能會縮小它 - 我不知道如何保持它們。 – 2013-05-14 11:07:28
@gordyr:我已經修復了「預期不變」的錯誤,看看它現在是否有效。 – 2013-05-14 11:12:52