6

この問題の詳細に入る前に、状況を明確にしたいと思います。私たちの Web 分析会社は大規模なサイトのコンサルタントとして働いており、(SCRIPT タグを 1 つ追加する以外に) ページ自体を制御することはできません。

既存のスクリプトは、ページ上の「新しい」(addEventListener または attachEvent) ハンドラーを完全に認識しない「古い」方法 (element.onclick = blah; の派手なバージョンで、元のハンドラーも実行する) を使用してハンドラーをインストールします。これを修正して、多くのカスタム開発を必要とせずにスクリプトをより多くのサイトで実行できるようにしたいと考えています。

ここで最初に考えたのは、独自のスクリプトで addEventListener/attachEvent を使用することでしたが、これには問題があります。クライアントのサイトで「古い」方法を使用してハンドラーを設定すると、「新しい」方法でインストールしたハンドラーが消去されます。すべてのブラウザーをテストしたわけではありませんが、簡単で汚いテストでは、IE7 と FF3 の両方でこれが発生することが示されています。また、ページのイベント ハンドラーが既に設定されている後に「新しい」方法を使用すると、それらのハンドラーが消去される可能性があるというリスクもあります。

だから私の質問は、ページ上の他のイベントハンドラーがどのようにインストールされているかに関係なく機能する addEventListener/attachEvent を使用して Javascript でイベントハンドラーを追加するために使用できる安全な手法は何ですか?

覚えておいてください: スクリプトがインストールされているサイトを変更する方法はありません。(このような質問に対するデフォルトの答えは常に「すべてを同じように書き直すだけです」であるため、強調しなければなりません。)

4

2 に答える 2

5

簡単なテストをもう一度試していただけますか? これはFF3では起こりません。

elem.onclick = function() { alert("foo"); };
elem.addEventListener("click", function() { alert("bar"); }, false);

要素をクリックすると、両方のハンドラーが起動します。

addEventListener(キャプチャフェーズを使用するかどうか)の最後のブール引数を忘れたと思います。attachEventまた、IE のニーズがonclickではなくであることを忘れていると思いますclick

于 2008-10-21T18:46:26.817 に答える
1

addEventListener/attachEvent は、ある意味では安全です。以前にノードに追加されたハンドラを変更せずに、新しいイベント ハンドラをノードに追加します (プロパティ onxxx を介して割り当てられた場合でも)。企業にとって、addEventListener/attachEvent を使用して外国のページにいくつかを持ち込むことが唯一の方法である必要があります。プロパティを介して onxxx ハンドラーを割り当てると、実際にホスティングページのスクリプトが壊れます (以前に同じ方法で割り当てられていました)。

于 2008-10-21T18:37:27.503 に答える