2012-02-12 19 views
3

DOMの準備ができたら、私のプラグインがDOMに対して行う「機能」を無効にします。DOMの準備ができたら、onLoadは常に起動されますか?

onloadコールバック内にコードを挿入すると、コールバックのreadyの後に必ず実行されますか?

私は100%で確実に何かの画像がなくても、準備が実行されてからオンロードされます。

答えて

3

私は@jAndy's answerが正しいと思うが、あなたはまた、ready()呼び出し内でonloadにコードを配置することによって、自分自身にいくつかの余分な保証を与えることができます。

メインのready()コールが最初に来るようにしてください。

$(document).ready(function() { 
    // Your normal ready handler 
}); 

$(window).load(function() { 
    // Placing code in another .ready() call in here will add it to the 
    // end of internal Array of ready handlers if any are pending 
    $(document).ready(function() { 
     // my onload code 
    }); 
}); 

ready()はすでに時間でonload火災を解雇しているのであれば、あなたのonloadコードがまだ実行されます。あなたの元ready()コードであることを意味します(DOMの準備ができたら、内部フラグが設定されているので、将来の.ready()コールがすぐに呼び出されます。)

onloadが発生したとき.ready()は何とかないが発射されている場合、最初に内部配列にあり、新しい.ready()コードが配列の末尾に追加されます。

DOMの準備ができたときに発生する主なjQuery.readyハンドラのat the sourceを探し(順番に、利用者の.ready()ハンドラのリストを発射する)、それはのように表示されます。


はEDIT

IEのバグがありますが、ハンドラが少し早く起動します。

このバグを修正するには、document.bodyが実際に表示されるまで、は非同期にハンドラを呼び出します。


ready: function (wait) { 
    // Either a released hold or an DOMready/load event and not yet ready 
    if ((wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady)) { 
 // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if (!document.body) { return setTimeout(jQuery.ready, 1); }  
     // Remember that the DOM is ready 
     jQuery.isReady = true; 

     // If a normal DOM Ready event fired, decrement, and wait if need be 
     if (wait !== true && --jQuery.readyWait > 0) { 
      return; 
     } 

     // If there are functions bound, to execute 
     readyList.fireWith(document, [jQuery]); 

     // Trigger any bound ready events 
     if (jQuery.fn.trigger) { 
      jQuery(document).trigger("ready").off("ready"); 
     } 
    } 
}, 

原因ハンドラのこの非同期ループで、その後、IEは、少なくとも.ready()ハンドラの前に呼び出さwindow.onloadハンドラを持つことにおそらくがちであろうと思われます。

上記のようにonloadのハンドラリストに.ready()ハンドラリストを追加すると、これを修正する必要があります。

+0

@gdoron:素早く[ソースを見て](https://github.com/jquery/jquery/blob/1.7.1/src/core.js#L400-403)、それはネイティブDOMの準備が少し早く始まるIEバグがあるように見えます。これを解決するために、jQueryは 'document.body'を見るまで主な' jQuery.ready'関数を非同期にループします。これは非同期なので、最初にonloadが発生する可能性が非常に高いと思われます。私が示したように、あなたのコードを '.ready()'に入れることはおそらくあなたの最も安全な賭けになるでしょう。 :) –

+0

私たちの雇用を維持するためのおかげで 'IE' ... =)。あなたの体の答えにそれを加えてください。 – gdoron

+1

@gdoron:いい考えです。私は分で更新します。 –

1

はい。何かがロードされたとき

  • onloadが起動します(画像、フレーム、アイフレームなど)、
  • DOMContentLoadedとすぐにDOMツリーにアクセス得ることができるように起動します。
+0

画像がない場合や数が少ない場合は、 – gdoron

+0

@gdoron:現在、イベントの注文に関する「公式」な仕様やドキュメントは見つかりません。しかし、99.9%の 'DOMContentLoaded'(サポートされている場合)は、画像、iframeなどがあるかどうかに関係なく、常に' load'の前に起動することになります。 – jAndy

+0

@jAndyが述べたように、はい、** ready **イベントの後に** onload **が実行されるのは、** ready **はDOMが存在するときに起動され、** onload **はすべてのアセット(画像など)を待つためです。 )をロードします。 http://api.jquery.com/ready/を見てください –

0

自分で試してみてください:大きなHTMLファイルを作成し、すべての依存リソース(イメージ、スクリプト、スタイルシート)を削除してテストします。すべてのリソースは、インターネットから取得され

enter image description here

負荷が発生します。 DOMContentLoadは、HTMLがフェッチされると起動します。およびが解析されます。後者は140 KBのHTMLコードで私のテストで14ミリ秒かかりました。確かにそれは最悪のケースですが、DOMContentLoadedの前に負荷が発生するという保証はありません。外部リソース(キャッシュ、HTTP/2による並列ダウンロード、高速接続など)でさえも保証されません。

+0

'console.log'でも試しましたか?あるいは、あなたは開発者ツールのUIだけに頼っていますか? – gdoron

+0

これは、JavaScriptよりも正確で、解析、コンパイル、実行が必要な開発者ツールの結果です。興味深いことに、この効果はChromiumベースのブラウザでのみ発生し、EdgeやFirefoxでは発生しませんでした。 – wortwart

+0

console.logでのテストでは、実際にDOMContentLoadedの後でonloadが発生します(Chromiumでも同様)。私はとにかくそれに頼るつもりはない。 – wortwart

関連する問題