次のHTMLがあるとします。
<div>
<span>span text</span> div text <span>some more text</span>
</div>
スパンをクリックすると、何らかのイベントがトリガーされるようにしたいと思います(たとえば、テキストを太字にする)。これは簡単です。
$('span').click( ... )
しかし、要素から離れてクリックすると、別のイベントをトリガーする必要があります(たとえば、テキストを通常の太さにするため)。どういうわけか、span要素の内側ではないクリックを検出する必要があります。これはblur()イベントと非常に似ていますが、非INPUT要素の場合です。このクリックがDIV要素内でのみ検出され、ページのBODY全体では検出されないかどうかは関係ありません。
次のように、非SPAN要素でトリガーするイベントを取得しようとしました。
$('div').click( ... ) // triggers in the span element
$('div').not('span').click( ... ) // still triggers in the span element
$('div').add('span').click( ... ) // triggers first from span, then div
別の解決策は、クリックイベント内のイベントのターゲットを読み取ることです。この方法で実装する例を次に示します。
$('div').click(function(e) {
if (e.target.nodeName != "span")
...
});
しかし、blur()のようなもっとエレガントな解決策があるのだろうかと思っていました。