[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
ただいまコメントを受けつけておりません。
いくつ要素があるかわからないリストに対し、”リストの要素をクリックしたらその要素に応じた何かが発生する”、というようにする。この際、リストの各要素にイベントをバインドしてもよいが、もっと楽にやれる方法がある。
<ul id="animals"> <li>こぶた</li> <li>たぬき</li> <li>きつね</li> <li>ねこ</li> </ul>
$('#animals').click(function(e) { alert($(e.target).text()); });
こうすると、クリックした動物の名前が出てくる。親要素にイベントをバインドした上で e.target
で実際にクリックされた要素を取得することで各 li にイベントバインドするよりも単純に書ける。
クリックされてイベントが発生してほしくないものがクリックされた場合の対処は以下がある。
以下の html で class ='noAlert'
のものをクリックしても出ないようにすることを考えてみよう。
<ul id="animals"> <li class='noAlert'>おに</li> <li>こぶた</li> <li>たぬき</li> <li>きつね</li> <li>ねこ</li> <li class='noAlert'>かいじゅう</li> </ul>
$('#animals').click(function(e) { if($(e.target).hasClass('noAlert')) { return; } alert($(e.target).text()); });
きわめて単純。 noAlert クラスを持つ場合は途中で return してしまう。多分こちらの方が直感的だと思う。
$('#animals').click(function(e) { alert($(e.target).text()); }); $('.noAlert').click(function(e){ e.stopPropagation(); });
stopPropagation を使うとイベントが伝播しなくなる。そのため、 li がクリックされたことはわかっても ul がクリックされたことをキャッチできなくなる。
noAlert の要素にイベントをバインドする、という面倒があるが……
UI Events Specification にもう少し詳しい話がある。
ただいまコメントを受けつけておりません。