ページローディングイベント
3957 ワード
DOMContentLoadedとwindow.onloadの違い
ページが完全にロードされたらWindows.onloadイベントが発生します.window.onloadイベントを利用してトリガして実行するには、ページが完全にロードされてから実行できるjavascriptスクリプトが必要です.しかし、もしページには多くのパターンファイル、画像ファイル、サブフレームページが含まれていたら、Oloadイベントはこれらのファイルのロードが完了するまで遅延されて実行されることもあります.私たちが必要とするものではない場合もあります.例えば、ページの受信からdomツリーの解析が完了するまでの時間を知りたいです.
この時はDOMContentLoadedが登場します.ページドキュメントの読み込みと解析が完了するとすぐにDOMContentLoadedイベントが出発します.スタイルファイル、画像ファイルとサブフレームページのロードを待つことはありません.
例
DOMContentLoadedは現在すべての主流ブラウザをサポートしています.IE 9以降もサポートしています.もっと多くのcan I useを見てください.
IEを互換するためには、readystatechangeイベントを使用してDOMドキュメントのロードが完了したかどうかを監視することができ、より早いIEバージョンでは、try/catchを用いて、一時的にdocument.document.doscroll('left')を実行して、この状態を監視することができる.このコードはDOMロードが完了する前にエラーが発生します.
以上の説明により、IE対応のDOMContentLoadedイベントfromを書くことができます.
現在多くのライブラリが互換性のあるページローディングを実現しています.まず、document.readyState===='complette'が本物かどうかを判断してから、もし本物ならば直接スクリプトを実行します.そうでなければ、スクリプトをページローディング完了イベントに結び付けて、documentがaddEventListenerがあるかどうかによって、主流ブラウザとIEブラウザを区別します.IE 9及び以降は基本的に主流のブラウザと同じ標準なので、主にIE 8と以下を区別するために用いられます.主流のブラウザにはDOMContentLoaded+window.loadを採用しています.IE 8及び以下については、onreadystechange+window.onload+doScrrollを採用しています.
ここで注意したいのですが、オンreadstatechangeイベントは信頼できません.ページに画像が存在する場合、逆にオンラインイベントの後にトリガされる可能性があります.正常には、ページはバイナリリソースを含んでいないか、または非常に少ないか、あるいはキャッシュされている時に代替案として実行されます. readystatechange ロード beforeunload unload 広く開拓する jquery ready分析 Contented Loaded DOMREAdyのIE互換性の実現については、なぜdoScallがあった後、DOMContentLoaded に近いですか?
ページが完全にロードされたらWindows.onloadイベントが発生します.window.onloadイベントを利用してトリガして実行するには、ページが完全にロードされてから実行できるjavascriptスクリプトが必要です.しかし、もしページには多くのパターンファイル、画像ファイル、サブフレームページが含まれていたら、Oloadイベントはこれらのファイルのロードが完了するまで遅延されて実行されることもあります.私たちが必要とするものではない場合もあります.例えば、ページの受信からdomツリーの解析が完了するまでの時間を知りたいです.
この時はDOMContentLoadedが登場します.ページドキュメントの読み込みと解析が完了するとすぐにDOMContentLoadedイベントが出発します.スタイルファイル、画像ファイルとサブフレームページのロードを待つことはありません.
例
document.addEventListener("DOMContentLoaded", function(event) {
console.log("DOM fully loaded and parsed");
});
互換性DOMContentLoadedは現在すべての主流ブラウザをサポートしています.IE 9以降もサポートしています.もっと多くのcan I useを見てください.
IEを互換するためには、readystatechangeイベントを使用してDOMドキュメントのロードが完了したかどうかを監視することができ、より早いIEバージョンでは、try/catchを用いて、一時的にdocument.document.doscroll('left')を実行して、この状態を監視することができる.このコードはDOMロードが完了する前にエラーが発生します.
以上の説明により、IE対応のDOMContentLoadedイベントfromを書くことができます.
// if IE
function IEContentLoaded (w, fn) {
var d = w.document, done = false,
// only fire once
init = function () {
if (!done) {
done = true;
fn();
}
};
// polling for no errors
(function () {
try {
// throws errors until after ondocumentready
d.documentElement.doScroll('left');
} catch (e) {
setTimeout(arguments.callee, 50);
return;
}
// no errors, fire
init();
})();
// trying to always fire before onload
d.onreadystatechange = function() {
if (d.readyState == 'complete') {
d.onreadystatechange = null;
init();
}
};
}
実験線現在多くのライブラリが互換性のあるページローディングを実現しています.まず、document.readyState===='complette'が本物かどうかを判断してから、もし本物ならば直接スクリプトを実行します.そうでなければ、スクリプトをページローディング完了イベントに結び付けて、documentがaddEventListenerがあるかどうかによって、主流ブラウザとIEブラウザを区別します.IE 9及び以降は基本的に主流のブラウザと同じ標準なので、主にIE 8と以下を区別するために用いられます.主流のブラウザにはDOMContentLoaded+window.loadを採用しています.IE 8及び以下については、onreadystechange+window.onload+doScrrollを採用しています.
ここで注意したいのですが、オンreadstatechangeイベントは信頼できません.ページに画像が存在する場合、逆にオンラインイベントの後にトリガされる可能性があります.正常には、ページはバイナリリソースを含んでいないか、または非常に少ないか、あるいはキャッシュされている時に代替案として実行されます.
function domReady(fn) {
var ready = false,
top = false,
doc = window.document,
root = doc.documentElement,
modern = doc.addEventListener,
add = modern ? 'addEventListener' : 'attachEvent',
del = modern ? 'removeEventListener' : 'detachEvent',
pre = modern ? '' : 'on',
init = function(e) {
if (e.type === 'readystatechange' && doc.readyState !== 'complete') return;
(e.type === 'load' ? window : doc)[del](pre + e.type, init, false);
if (!ready && (ready = true)) fn.call(window, e.type || e);
},
poll = function() {
try {
root.doScroll('left');
} catch(e) {
setTimeout(pull, 50);
return;
}
init('poll');
};
if (doc.readyState === 'complete') fn.call(window, 'lazy');
else {
if (!modern && root.doScroll) {
try {
top = !window.frameElement;
} catch(e) {}
if (top) poll();
}
doc[add](pre + 'DOMContentLoaded', init, false);
doc[add](pre + 'readystatechange', init, false);
window[add](pre + 'load', init, false);
}
}
関連事件