私はJavascriptライブラリのイベント処理コードに取り組んでおり、IE 6でも機能するstopImmediatePropagation()に似たものを実装しようとしています。
現在のイベント処理の仕組みは、イベント処理コードがオブジェクトに登録され、ユーザーがすべてのイベントをイベントハンドラーに登録することです。
stopImmediatePropagation()をエミュレートしようとした最初の方法は、そのメソッドがまだ存在しない場合は、そのメソッドをイベントに追加することでした。
if (event != null && event.isImmediatePropagationEnabled == null) {
event.stopImmediatePropagation = function () {
this.isImmediatePropagationEnabled = false;
};
event.isImmediatePropagationEnabled = true;
event.isImmediatePropagationStopped = function () {
return !this.isImmediatePropagationEnabled;
};
}
ユーザーのイベントハンドラコールバックが呼び出されると、取得したのと同じイベントオブジェクトに渡されます。必要に応じて、イベントでstopImmediatePropagation()を呼び出すことができます。
登録されているすべてのイベント処理コールバックをループしているので、毎回伝播ブール値をチェックします。
given some event
for [all the callbacks] {
if (event != null &&
event.isImmediatePropagationStopped != null &&
event.isImmediatePropagationStopped()) {
stopPropagation = true;
break;
}
execute the callback, passing in the event
}
これは、一部のブラウザでうまく機能します。 イベントは存続するため、イベント処理コードが終了してイベントが次の要素にバブルアップした場合でも、イベント処理コードが再度ヒットすると、isImmediatePropagationStoppedプロパティが引き続き存在するため、(登録されている)コールバックは実行されません。 。
Internet Explorerでは(8でも)、これはしません。作業。同じ要素で、物事は大丈夫です。ただし、イベントがバブルすると、まったく新しいイベントオブジェクトが生成されたように見え、isImmediatePropagationStoppedプロパティが失われます。これは、ユーザーが伝播をオフにしたかどうかを確認できないことを意味します。
だから私の質問は、これを行う方法について誰かが何かアイデアを持っていますか? jqueryが同様の偉業を管理していることを私は知っています( http://bugs.jquery.com/ticket/3355 )、しかし彼らはそれを同様の方法で行います-それをに保存しますオブジェクトの追加データ。私が知らないのは、オブジェクトの非永続性が私と同じように彼らを傷つけない方法です。 (そしてさまざまな理由から、jquery自体を使用することはここではオプションではありません)
誰かが何か洞察を持っているなら-私よりもJavascriptについてもっと知っているか、彼らがこれを行うためのきちんとした方法を考えることができるからです-私はそれを大いに感謝します。ありがとう!
回答:
回答№1は6関数を少し変更してみてください。
event.stopImmediatePropagation = function () {
this.isImmediatePropagationEnabled = false;
this.cancelBubble = true;
};
その「cancelBubble」フラグはIEのものであり、イベントが親DOM要素チェーンをバブリングするのを防ぐ必要があります。