window.onload
とdocument.onload
のどちらがより広くサポートされていますか?
いつ発砲するの?
document.onload
どの程度サポートされていますか?
window.onloadが最も広くサポートされているようです。実際、最新のブラウザの中にはある意味でdocument.onloadをwindow.onloadに置き換えているものがあります。多くの人が jQuery などのライブラリを使用して、ドキュメントの準備が整っているかどうかを確認しているのは、ブラウザサポートの問題が原因と考えられます。
$(document).ready(function() { /* code here */ });
$(function() { /* code here */ });
歴史のために:
window.onloadとbody.onload
注意として、 codingforumswindow.onload
の上でのbody.onload
の使用法について、しばらく前に同じ質問がされました。結果は、あなたが window.onload を使うべきであるように思われました。なぜならそれはあなたの構造をアクションから切り離すのが良いからです。
一般的な考えは、window.onload firesドキュメントのウィンドウが[ready for presentationの場合、およびdocument.onload firesの場合DOM tree(ドキュメント内のマークアップコードから構築)はcompletedです。
理想的には、 DOMツリーイベント にサブスクライブすると、JavaScriptを介したオフスクリーン操作が可能になり、ほとんどCPU負荷なしが発生します。反対に、window.onload
は、複数の外部リソースがまだ要求、解析、およびロードされていない場合、起動にしばらく時間がかかりますが可能です。
►テストシナリオ:
違いとブラウザの使い方選択肢実装前述のイベントハンドラを確認するには、次のコードをドキュメントの-<body>
-タグに挿入します。
<script language="javascript">
window.tdiff = []; fred = function(a,b){return a-b;};
window.document.onload = function(e){
console.log("document.onload", e, Date.now() ,window.tdiff,
(window.tdiff[0] = Date.now()) && window.tdiff.reduce(fred) );
}
window.onload = function(e){
console.log("window.onload", e, Date.now() ,window.tdiff,
(window.tdiff[1] = Date.now()) && window.tdiff.reduce(fred) );
}
</script>
►結果:
Chrome v20(およびおそらくほとんどの最新ブラウザー)で観察可能な結果の動作を次に示します。
document.onload
イベントはありません。onload
は、<body>
内で宣言されると2回、<head>
内で宣言されると1回発生します(イベントはdocument.onload
として機能します)。window.onload
要素の範囲内で<head>
イベントハンドラーを宣言します。►サンプルプロジェクト:
上記のコードは このプロジェクトのもの codebase(index.html
およびkeyboarder.js
)から取得されています。
ウィンドウオブジェクトのイベントハンドラ のリストについては、MDNのドキュメントを参照してください。
イベントリスナを追加します
<script type="text/javascript">
document.addEventListener("DOMContentLoaded", function(event) {
// - Code to execute when all DOM content is loaded.
// - including fonts, images, etc.
});
</script>
Update March 2017
window.addEventListener('load', function() {
console.log('All assets are loaded')
})
$(window).on('load', function() {
console.log('All assets are loaded')
})
HTML文書の解析 - 終わり によれば、
ブラウザはHTMLソースを解析し、遅延スクリプトを実行します。
すべてのHTMLが解析されて実行されると、DOMContentLoaded
がdocument
に送出されます。イベントはwindow
にバブルします。
ブラウザは、読み込みイベントを遅らせるリソース(画像など)を読み込みます。
load
イベントはwindow
に送出されます。
したがって、実行順序は次のようになります。
DOMContentLoaded
のwindow
イベントリスナDOMContentLoaded
のdocument
イベントリスナーDOMContentLoaded
のwindow
イベントリスナーload
のonload
イベントリスナ(window
イベントハンドラを含む)load
内のバブルonload
イベントリスナ(document
イベントハンドラを含む)は決して呼び出されるべきではありません。 キャプチャload
リスナーのみが呼び出されるかもしれませんが、スタイルシートのようなサブリソースのロードによるもので、ドキュメント自体のロードによるものではありません。
window.addEventListener('DOMContentLoaded', function() {
console.log('window - DOMContentLoaded - capture'); // 1st
}, true);
document.addEventListener('DOMContentLoaded', function() {
console.log('document - DOMContentLoaded - capture'); // 2nd
}, true);
document.addEventListener('DOMContentLoaded', function() {
console.log('document - DOMContentLoaded - bubble'); // 2nd
});
window.addEventListener('DOMContentLoaded', function() {
console.log('window - DOMContentLoaded - bubble'); // 3rd
});
window.addEventListener('load', function() {
console.log('window - load - capture'); // 4th
}, true);
document.addEventListener('load', function(e) {
/* Filter out load events not related to the document */
if(['style','script'].indexOf(e.target.tagName.toLowerCase()) < 0)
console.log('document - load - capture'); // DOES NOT HAPPEN
}, true);
document.addEventListener('load', function() {
console.log('document - load - bubble'); // DOES NOT HAPPEN
});
window.addEventListener('load', function() {
console.log('window - load - bubble'); // 4th
});
window.onload = function() {
console.log('window - onload'); // 4th
};
document.onload = function() {
console.log('document - onload'); // DOES NOT HAPPEN
};
Chromeでは、window.onloadは<body onload="">
とは異なりますが、Firefox(バージョン35.0)とIE(バージョン11)の両方で同じです。
次のスニペットでそれを探ることができます。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!--import css here-->
<!--import js scripts here-->
<script language="javascript">
function bodyOnloadHandler() {
console.log("body onload");
}
window.onload = function(e) {
console.log("window loaded");
};
</script>
</head>
<body onload="bodyOnloadHandler()">
Page contents go here.
</body>
</html>
そして、Chromeコンソールには "window loaded"(最初に来る)と "body onload"の両方が表示されます。ただし、FirefoxとIEでは、単に「body onload」と表示されます。 IE&FFのコンソールで "window.onload.toString()
"を実行すると、次のようになります。
"function onload(event){bodyOnloadHandler()}"
これは、割り当て "window.onload = function(e)..."が上書きされることを意味します。
window.onloadしかし、それらはしばしば同じものです。同様に、body.onloadはIEではwindow.onloadになります。
window.onload
とonunload
は、document.body.onload
とdocument.body.onunload
へのショートカットです。
すべてのHTMLタグのdocument.onload
およびonload
ハンドラーは予約されているようですが、トリガーされません
文書内の 'onload
' - > true
ただし、Window.onloadが標準です - PS3のWebブラウザ(Netfrontベース)はウィンドウオブジェクトをサポートしていないため、そこで使用することはできません。