jQuery 「イベント」イベントにイベントハンドラを割り当てる

イベントに対し、イベントハンドラを割り当てます。従来の.live()、.delegate()、.bind()の機能は.on()に統合されましたので、廃止はたは非推奨になっています。これから開発するスクリプトでは.on()を使います。最初の書式では、1つまたは複数のイベントに対して、1つのイベントハンドラを割り当てます。複数のイベントを指定する場合は

$('table').on('click dbclick', 'td',{msg:message},function(e){
    alert(e.data.msg);
});

のように、イベントキーワードをスペース区切って記述します。指定できるイベントキーワードには、blur、focus、focusin、focusout、load、resize、scroll、unload、click、dblclick、mousedown、mouseup、mousemove、mouseover、mouseout、mouseenter、mouseleave、change、select、submit、keydown、keypress、keyup、errorがあります。また、第2引数にセレクタを指定することで、対象要素の絞り込みが可能です。さらに、省略可能な第3引数を使って、イベントハンドラにデータを渡せます。渡されたデータは、イベントオブジェクトのdataプロパティに格納され、イベントハンドラ内から利用が可能です。

書式

$(対象要素).on(イベントタイプ,[セレクタ],[データ],[イベントハンドラ])
$('table').on('click','td',{msg: hello}, function(e){
    alert(e.data.msg);
});

サンプル

イベントハンドラを登録する

 <body>
    <div class="main">
    <div class="header">
    <h1> サンプル </h1>
    </div>
    <div class="content">
      <table>
        <tr>
          <th>ID</th>
          <th>商品名</th>
          <th>単価</th>
          <th>数量</th>
        </tr>
        <tr>
          <td>1</td>
          <td>納豆</td>
          <td>1000</td>
          <td>20</td>
        </tr>
        <tr>
          <td>2</td>
          <td>スパゲッティ</td>
          <td>1000</td>
          <td>10</td>
        </tr>
        <tr>
          <td>3</td>
          <td>牛丼</td>
          <td>1200</td>
          <td>1</td>
        </tr>
        <tr>
          <td>4</td>
          <td>トウモロコシ</td>
          <td>200</td>
          <td>5</td>
        </tr>

      </table>
    </div>
    <div class="footer">
      <hr>
      <p class="copyright">2024 xxxx all rights reserved.</p>
    </div>
    </div>
    <script>
    $(document).ready(function(){
      $('table').on('click dblclick', 'td', {msg: 'クリックしました'}, 
      function(e) {
        alert($(this).text() + e.data.msg);
      });
    });
    </script>
    </body>
実行結果
実行結果

イベントハンドラとネームスペース

.on()の第1引数には、「click」などの規定のイベントだけでなく例えば「click.myApp」といった独自のイベント名も指定できます。独自の名前のイベントは.trigger()を使って発火できます。

$('.mydiv').on('click.myApp', function(){
  alert('実行されました');
});
$('button').on('click', function(){
  alert('ボタンクリック');
  $('.mydiv').trigger('click.myApp');
});

「click.myApp」の「myApp」部分は「ネームスペース」として扱われます。ネームスペースを付けて修飾はすることで、既定の「click」イベントや他の名前空間の「click」イベントからこのイベントを分離して区別できるようになります。先のサンプルでは、「.mydiv」の要素をクリックしたとき、ボタン「button」をクリックしたときのどちらもアラートが表示されます。ネームスペース付のイベントは、ネームスペースに対応するイベントハンドラだけを解除できます。次の例では、「.mydiv」を1度クリックすると「click.myApp」に対するイベントハンドラだけが解除されますが、「click」のイベントハンドラには影響しません。

$('.mydiv').on('click.myApp', function(){
  alert('実行されました');
  $('.mydiv').off('click.myApp');
});
$('button').on('click', function(){
  alert('ボタンクリック');
  $('.mydiv').trigger('click.myApp');
});