3

今日、奇妙なエラーに遭遇しました。window.onloadすべてのサイトにイベントを追加する簡単なユーザースクリプトがありました。しかし、サイトの1つに<body onload="func();">定義がありました。何が起こったのかというと、それwindow.onloadは通常通り機能していましたが<body onload="">、userscriptをインストールした後、サイトで機能しなくなりました。

私がwindow.body.onload代わりに使用したとき、両方ともうまくいきました。私はそれを知っていて、同じことwindow.onloadをする別の方法ですが、それをうまく機能させるため<body onload="">に何が起こっているのですか?window.body.onload<body onload="">

4

2 に答える 2

2

Window.onloadとbodyタグのonloadは同じイベントです。したがって、2つの異なるメソッドで同じイベントを2回設定すると、最終的には1つの値(関数の1つ)になります。

window.body.onloadは別のイベントです。DoMのもう1つの癖と、ブラウザがそれを使って何をするか。

于 2012-01-12T08:53:02.117 に答える
1

Myforwikが言ったように、あなたがフックアップするイベントはあなたがフックアップするwindow.onload = ...;のと同じイベントです<body onload="...">。それはwindow loadイベントです。それをフックするこれらの方法は両方とも、しばらくの間廃止された古いDOM0スタイルにあります。両方を指定すると、後者が勝ち、前者がノックアウトされます。window.onload複数のスクリプトを個別に設定する場合も同様です。

この種の問題を回避するには、DOM2スタイルのイベントフックアップを使用します。

if (window.addEventListener) {
    // DOM2 standard
    window.addEventListener("load", handler, false);
}
else if (window.attachEvent) {
    // Microsoft's precursor to it, IE8 and earlier
    window.attachEvent("onload", handler);
}
else {
    // Some pre-1999 browser
    window.onload = handler;
}

function handler() {
}

複数のDOM2ハンドラーを同じイベントにアタッチできるため、関連のない複数のスクリプトがそのイベントをサブスクライブできます。また、DOM2ハンドラーはDOM0ハンドラーとうまく共存します。

したがって、上記を使用するようにユーザースクリプトを更新しても、<body onload="...">ページは影響を受けません。

于 2012-01-12T09:01:41.820 に答える