DOMの準備ができたら、私のプラグインがDOMに対して行う「機能」を無効にします。DOMの準備ができたら、onLoadは常に起動されますか?
onload
コールバック内にコードを挿入すると、コールバックのready
の後に必ず実行されますか?
私は100%で確実に何かの画像がなくても、準備が実行されてからオンロードされます。
DOMの準備ができたら、私のプラグインがDOMに対して行う「機能」を無効にします。DOMの準備ができたら、onLoadは常に起動されますか?
onload
コールバック内にコードを挿入すると、コールバックのready
の後に必ず実行されますか?
私は100%で確実に何かの画像がなくても、準備が実行されてからオンロードされます。
私は@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()
ハンドラリストを追加すると、これを修正する必要があります。
はい。何かがロードされたとき
onload
が起動します(画像、フレーム、アイフレームなど)、DOMContentLoaded
とすぐにDOMツリーにアクセス得ることができるように起動します。画像がない場合や数が少ない場合は、 – gdoron
@gdoron:現在、イベントの注文に関する「公式」な仕様やドキュメントは見つかりません。しかし、99.9%の 'DOMContentLoaded'(サポートされている場合)は、画像、iframeなどがあるかどうかに関係なく、常に' load'の前に起動することになります。 – jAndy
@jAndyが述べたように、はい、** ready **イベントの後に** onload **が実行されるのは、** ready **はDOMが存在するときに起動され、** onload **はすべてのアセット(画像など)を待つためです。 )をロードします。 http://api.jquery.com/ready/を見てください –
自分で試してみてください:大きなHTMLファイルを作成し、すべての依存リソース(イメージ、スクリプト、スタイルシート)を削除してテストします。すべてのリソースは、インターネットから取得され
負荷が発生します。 DOMContentLoadは、HTMLがフェッチされると起動します。およびが解析されます。後者は140 KBのHTMLコードで私のテストで14ミリ秒かかりました。確かにそれは最悪のケースですが、DOMContentLoadedの前に負荷が発生するという保証はありません。外部リソース(キャッシュ、HTTP/2による並列ダウンロード、高速接続など)でさえも保証されません。
@gdoron:素早く[ソースを見て](https://github.com/jquery/jquery/blob/1.7.1/src/core.js#L400-403)、それはネイティブDOMの準備が少し早く始まるIEバグがあるように見えます。これを解決するために、jQueryは 'document.body'を見るまで主な' jQuery.ready'関数を非同期にループします。これは非同期なので、最初にonloadが発生する可能性が非常に高いと思われます。私が示したように、あなたのコードを '.ready()'に入れることはおそらくあなたの最も安全な賭けになるでしょう。 :) –
私たちの雇用を維持するためのおかげで 'IE' ... =)。あなたの体の答えにそれを加えてください。 – gdoron
@gdoron:いい考えです。私は分で更新します。 –