2013-05-14 66 views
1

我已經寫了一個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實用程序,並且需要它成爲最小的可能方法。我討厭使用任何形式的瀏覽器檢測,但它看起來好像它是我唯一的解決方案。這就是說,如果任何人都可以用另一種方式想出來,那就太棒了。

任何建議將受到感謝。

回答

2

您可以使用JScript conditional compilation,它只能在IE瀏覽器中使用(最高可達IE10)。

因爲這是一條評論,所以最好將它放在new Function之內,因爲縮小版可能會刪除它,更改您的代碼。雖然一般來說你應該避免使用new Function,在這種情況下,沒有任何其他方法可以防止縮小器將其移除。

例子:

var isIE = !(new Function('return 1//@cc_on &0')()); 

然而,似乎是你的主要問題是,在DOM尚未加載 - 確保它運行使用DOMContentLoaded事件(IE9 +)任何裝載之前加載:

document.addEventListener('DOMContentLoaded', function() { 
    // perform logic here 
}); 
+0

這是一個奇妙的方法。我甚至從來不知道這在IE中存在。不幸的是,你發佈的代碼在IE中失敗......這可能是一個簡單的錯誤,我會通過你提供的鏈接並找出問題出在哪裏。如果可行,這將是一個完美的解決方案。你知道這是否會在谷歌關閉時正確縮小? – gordyr 2013-05-14 11:06:33

+0

對不起 - 我會看到我出錯的地方。另外Closure Compiler可能會縮小它 - 我不知道如何保持它們。 – 2013-05-14 11:07:28

+0

@gordyr:我已經修復了「預期不變」的錯誤,看看它現在是否有效。 – 2013-05-14 11:12:52

2

這是另一個解決方案,因爲澳航的解決方案可能並不總是有效。例如在UMTS連接上,它可能發生提供商刪除評論以節省帶寬(可能他們保留有條件的評論):

if(navigator.appName == 'Microsoft Internet Explorer' 
    && doc.readyState !== 'complete'){ 
    ... 
} 
+1

事件更好...儘管Qantas解決方案可以正常工作,但您可以執行以下操作:var is_ie = eval(「/ * @ cc_on!@ */false」);使用eval你甚至可以關閉正確編譯它。無論你的解決方案是優惠的,儘管我喜歡瞭解有關條件編譯:) – gordyr 2013-05-14 11:25:32

相關問題