---- --------------------------------
| ドキュメント
| ---- ------- ------------ |
| ---- ------------
---------------------- ------- -----
element1.onclick = doSomething;
element2.onclick = doSomething;
ユーザーが element1 または element2 をクリックすると、doSomething() が実行されます。必要に応じて、ここで彼の拡散を止めることもできます。そうでない場合は、defaultFunction() が実行されます。ユーザーが他の場所をクリックした場合も、defaultFunction() が実行されます。場合によってはこれが役立つこともあります。
ドラッグコードを記述する際には、グローバルイベントハンドラーの設定が必要です。通常、レイヤー上の Mousedow イベントはこのレイヤーを選択し、mousemove イベントに応答します。通常、マウスダウンはブラウザのバグを避けるためにこのレベルで登録されますが、他のイベント ハンドラーはドキュメント全体である必要があります。
ブラウザ ロジックの第一法則を思い出してください。ほとんど準備ができていないときに、何でも起こります。発生する可能性があるのは、ユーザーのマウスが激しく動き、コードが追いつかず、マウスがこのレイヤーに存在しなくなることです。
onmousemove イベント ハンドラーがレイヤーに登録されている場合、レイヤーがマウスの動きに応答しなくなると、ユーザーは間違いなく混乱します。
onmouseup イベント ハンドラーが特定のページに登録されている場合、ユーザーがマウスを放したときにプログラムはレイヤーをキャプチャせず、レイヤーはマウスとともに移動したままになります。
グローバル イベント ハンドラーの実行が保証されているため、この場合はイベント バブリングが重要です。
オフにしてください
ただし、通常は、関連するキャプチャとバブリングをすべてオフにする必要があります。さらに、ドキュメント構造が非常に複雑である場合 (多数の複雑なテーブルなど)、システム リソースを節約するためにバブリングをオフにする必要もあります。それ以外の場合、ブラウザーは親要素を 1 つずつチェックして、イベント ハンドラーがあるかどうかを確認する必要があります。存在しないかもしれませんが、探すのはやはり時間の無駄です。
Microsoft モードでは、イベントの cancelBubble プロパティを true に設定する必要があります。
window.event.cancelBubble = true
W3C モードでは、stopPropagation() メソッドを呼び出す必要があります。
e.stopPropagation()
これにより、このイベントのバブリングフェーズが停止します。イベントの攻略極限を防ぐことは基本的に不可能です。理由も知りたいです。
完全なクロスブラウザ コードは次のとおりです:
function doSomething(e)
{
if (!e) var e = window.event;
e.cancelBubble = true; ();
}
cancelBubble をサポートしていないブラウザで設定しても問題ありません。ブラウザはそのような属性を作成します。もちろん、安全のためだけでは意味がありません。
currentTarget
前に述べたように、イベントにはターゲットが含まれるか、srcElement にはイベントが発生した要素への参照が含まれます。この場合、ユーザーがクリックしたため、それは element2 です。
このターゲットはキャプチャ中およびバブリング中は変化しないことを理解することが重要です。
ただし、次のイベント ハンドラーを登録するとします。
element1.onclick = doSomething; 🎜>element2.onclick = doSomething;
ユーザーが element2 をクリックすると、doSomething() が 2 回実行されます。では、どの HTML 要素がこのイベントを処理するのかをどのようにして知ることができるのでしょうか? target/scrElement は答えを与えることができません。イベントの最初から element2 を指しています。
この問題を解決するために、W3C は currentTarget 属性を追加しました。これには、処理されるイベントの HTML 要素への参照が含まれています。これは、必要なものです。残念ながら、Microsoft モードには同様のプロパティがありません。
このキーワードも使用できます。この例では、currentTarget で始まる、処理中のイベントの HTML 要素を指します。
Microsoft モデルの問題
しかし、Microsoft のイベント登録モデルを使用する場合、this キーワードは HTML 要素にのみ適用されるわけではありません。その場合、 currentTarget のようなプロパティはありません。つまり、次のようにすると、
element1.attachEvent('onclick',doSomething)
element2.attachEvent('onclick',doSomething)
は実行されません。どの HTML 要素がイベントを処理しているかを知ることができます。これは Microsoft のイベント登録モデルの最も深刻な問題であるため、たとえ IE/win でのみ動作するプログラムであっても、このモデルは絶対に使用しないでください。
Microsoft が currentTarget のようなプロパティをすぐに追加することを願っていますか、それとも標準に従っていますか?私たちは早急にデザインを必要としています。
続き
学習を続けたい場合は、次の章をお読みください。
元のアドレス: http://www.quirksmode.org/js/events_order.html
私のツイッター: @rehawk