Chrome内でのJSの挙動の違い

また椅子で寝落ちしててこの時間です。おはようござまーす


作ってほったらかしてたJustResizeを修正してたのですが
前からちょっと気になっていた点があるので列挙してきます。

    • window.onloadのタイミング

通常onloadはHTML内の文章を読んだあとに画像を読み込み、そのあとに実行される。
以下のサンプルだと次の画像のようになる。

<html>
<head>
<title>test</title>
<script type="application/javascript">
window.addEventListener("load", function() {
    alert("loaded");
}, false);
</script>
</head>
<body>
 javascript sample
 </body>
 </html>


ちゃんと文章が表示されたあとにアラートが出ている。


次はChromeに同様のコードを書いてみる。テスト用のアドオンを作るのも面倒なのでjustresize.jsをカスタマイズ。

window.addEventListener("load", function() {
    alert("loaded: in JustResize");
}, false);

これでFirefoxを再起動すると・・・

まずこのアラートがデスクトップ画面の左上に表示され、ここでOKを押すとブラウザが表示される。もちろんその後には先ほどの文章が表示されたあとに「loaded」と表示される。
windowオブジェクトであるウィンドウ(フレーム)が表示されてないのにwindow.alertは使えてるし・・・そもそも何かをloadしたからこのイベントが発生してるわけだし・・・


よくわかりません

    • 追記

それぞれのalertの部分を

var cnt = 0;
for(var i in window) cnt++;
alert(cnt);

にしてみた。
アドオン内では1115、test.htmlの方では95だった。
windowが指してる対象が違う・・・?
御存知の方いらっしゃいますかー?

    • 解決編

MDCで該当ページみつけられました。
というかここ昨日も調べた時に見たページだったのに見逃してたorz
とりあえずここになります。
chrome コードでウィンドウを取り扱う - Mozilla | MDN


通常HTMLページで使っているwindowはChrome内からのwindowではchrome://browser/content/browser.xulを指していました。
この中の要素として複数の(タブ単位の)windowがある、というイメージになりますので
結局のところ、今開いてるタブのwindowオブジェクトにアクセスするにはcontentが使えます。
その下のdocumentならcontent.documentですね。
タブ指定しての対象windowの取り方はこれから調べてみます。