忍者ブログ

ひつ(じのひよこが)プログラミングします。
お仕事や趣味で困ったこととか、何度も「あれ?どうだったかしら」と調べたりしたこととか、作ったものとか、こどものこととかを書きます
★前は週末定期更新でしたが今は不定期更新です

2024/11    10« 1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  »12

一覧にイベントバインドする

×

[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 にイベントバインドするよりも単純に書ける。

例外処理

クリックされてイベントが発生してほしくないものがクリックされた場合の対処は以下がある。

  • e.target の内容でフィルタリングする
  • クリックされたら困る要素で e.stopPropergation() する

以下の 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 してしまう。多分こちらの方が直感的だと思う。

stopPropergation

  $('#animals').click(function(e) {
    alert($(e.target).text());
  });
  $('.noAlert').click(function(e){
    e.stopPropagation();
  });

stopPropagation を使うとイベントが伝播しなくなる。そのため、 li がクリックされたことはわかっても ul がクリックされたことをキャッチできなくなる。

noAlert の要素にイベントをバインドする、という面倒があるが……

参考文献

UI Events Specification にもう少し詳しい話がある。

PR

コメント

ただいまコメントを受けつけておりません。

ブログ内検索

P R