2011-08-01 15 views
20

私はこのコードを継承しました。ウィンドウオブジェクトとドキュメントオブジェクトの両方にイベントリスナーを追加しているので、最適でない可能性があります。ただし、ブラックベリー5.0を除いて正常に動作しています。このすべてが正しく設定されているか、それをより良くするための推奨事項があれば、誰かに説明することができますか?Cross Browser Dom Ready

 if (document.readyState === "complete") 
      callback(); 
     else if (document.addEventListener) 
     { 
      document.addEventListener("DOMContentLoaded",callback,false); 
      window.addEventListener("load",callback,false); 
     } 
     else if(window.attachEvent) 
     { 
      document.attachEvent("onreadystatechange", callback); 
      window.attachEvent("onLoad",callback); 
     } else 
      setTimeout(callback,2000); 
+2

すべてのJSを文書の最後に置く。それはほとんど同じです。 – Saxoier

+1

これは、スクリプトを非同期に読み込んでいない場合は表示されません。 – VinnyD

+0

asyncを使用している場合。あなたが 'DOMContentLoaded'やこの非同期の実行のために提案した方法を使用しないでください。スクリプトは、このイベントが発生した後、またはHTMLパーサーがhtmlファイルの最後に到達した後に発生することがあります。したがって、 'window.onload'と' xhr.onreadystatechange'のみが使用できます - 両方ともクロスブラウザ互換です。 – Saxoier

答えて

62

。私はDiego Periniの作品を見てみることをお勧めします。彼の仕事とメソッドは、jQueryを含む多くのDOMライブラリで使用されています。その男は、残念ながら多くの信用を得ていないようです。彼はtry/catchポーリングメソッドを開発した人です。これは、IEが混在したときにクロスブラウザDOMロードイベントを可能にするものです。あなたは純粋なJavaScriptを使用したい場合は

https://github.com/dperini/ContentLoaded/blob/master/src/contentloaded.js

+11

+1はjQueryによって使用された彼の作品であり、彼はいくつかのクレジットを受けなければならないからです。 –

+0

非常にいいです、+1に値する。 –

+0

これはうまくいきました。私が以前に試した他の小さな断片とは対照的です。成熟したコード+1と思われる。 – Rolf

3

個人的に私は、このためにjQueryを使用すると思います。

jQueryは、ドキュメント準備完了状態のさまざまなブラウザインパメントを処理するように設計されています。

あなたの上記のコードは次のようになりjQueryのを使用して:あなたはどのように行うのを知っているか、それを行う方法を確認したい場合は

$(callback); 
5

、あなたは()ロシア語(ソース:http://javascript.ru/unsorted/top-10-functions)をthу以下のクロスブラウザの機能を使用することができます

function bindReady(handler){ 
    var called = false  
    function ready() { 
     if (called) return 
     called = true 
     handler() 
    }  
    if (document.addEventListener) { 
     document.addEventListener("DOMContentLoaded", function(){ 
      ready() 
     }, false) 
    } else if (document.attachEvent) { 
     if (document.documentElement.doScroll && window == window.top) { 
      function tryScroll(){ 
       if (called) return 
       if (!document.body) return 
       try { 
        document.documentElement.doScroll("left") 
        ready() 
       } catch(e) { 
        setTimeout(tryScroll, 0) 
       } 
      } 
      tryScroll() 
     } 
     document.attachEvent("onreadystatechange", function(){  
      if (document.readyState === "complete") { 
       ready() 
      } 
     }) 
    } 
    if (window.addEventListener) 
     window.addEventListener('load', ready, false) 
    else if (window.attachEvent) 
     window.attachEvent('onload', ready) 
    /* else // use this 'else' statement for very old browsers :) 
     window.onload=ready 
    */ 
} 
readyList = []  
function onReady(handler) { 
    if (!readyList.length) { 
     bindReady(function() { 
      for(var i=0; i<readyList.length; i++) { 
       readyList[i]() 
      } 
     }) 
    } 
    readyList.push(handler) 
} 

使用法:

onReady(function() { 
    // ... 
}) 
+0

これはブラックベリーではうまくいきません5.とにかく感謝! – VinnyD

関連する問題