

jQueryのdelegate系(on/off)で、例えば以下のようにやると、<form>でもclickイベントが発動してしまうと思います。

[code]

    var selector = 'a, form';
    
    $(document).on('click submit', selector, function() {
        // something
    });
    
[/code]

これを、 **`var selector = 'a, form';`
の部分は変えない前提で**、<a>はclickイベントのみ、<form>はsubmitイベントのみ発動するようにできますでしょうか？

ちなみに、以下のようなものを試してみましたが動作しませんでした。  
（どちらも発動されてしまいます）

[code]

    var selector = 'a, form'; // ここは変えられない
    
    $(document).on('click submit', selector, function() {
        // something
    });
    
    $(document).off('submit', 'a'); // <a>はsubmitイベントを無効にしたい
    $(document).off('click', 'form'); // <form>はclickイベントを無効にしたい
    
    // これもダメでした。
    $('a').off('submit');
    $('form').off('click');
    
[/code]

* * *

**追記**

やりたいこととしては、ajaxで他ページを取得し表示するというプラグインを作成しており、<a>タグ（ボタン系）と<form>に対応したいです。  
ajaxでコンテンツを取得後、さらにその中に<a>や<form>等があれば、それも適用対象にしたいという感じです。


CC BY-SA 3.0
2015-03-26T07:31:52.080
8427
2015-07-26T06:05:06.977
2015-03-26T09:11:08.273
3876
3876
question
jquery
jQueryでのdelegate系(on/off)で、要素をフィルタしたい


なにやら複雑なバックグラウンドが見え隠れしていますが、とりあえず単純に無効化して登録し直しはダメなのですか？

色々やり方はあるのでこれがダメならちゃんとした版でお答えします。

[code]

    var selector = 'a, form';
    
    $(document).on('click submit', selector, function() {});
    $(document).off('click submit', selector, function() {});
    
    $(document).on('click', 'a', function() {
      alert('click');
      // do click process
    });
    $(document).on('submit', 'form', function() {
      alert('submit');
      // do submit process
    });
    
[/code]


CC BY-SA 3.0
2015-03-26T07:41:57.233
8428
2015-03-26T07:41:57.233
7214
8427
answer


意図はよく分かりませんが、イベントの種類とターゲットを取得すれば場合分けは出来るかと思います。

[code]

    $(document).on('click submit', selector, function(e) {
      if (e.type === 'click' && e.target === $('a').get(0)) {
        // a click
      } else if (e.type === 'submit' && e.target === $('form').get(0)) {
        // form submit
      }
    });
    
[/code]


CC BY-SA 3.0
2015-03-26T08:05:17.610
8432
2015-03-26T08:05:17.610
2232
8427
answer


.onのcallbackの中で`this.nodeName`を見て何をするか決めればいいのではないでしょうか。


CC BY-SA 3.0
2015-03-27T23:16:06.047
8496
2015-03-27T23:16:06.047
8136
8427
answer


最初の`var selecter` にいれるところは配列の方がよさそうですね。

[code]

    var selecter = 'a, form';
    var ss = selecter.split(', ');
    $.each(ss, function(i, d){
        $(document).on('click submit', d, function() {
            console.log(123+d);
        });
    });
    $(document).off('click', 'a');
    
[/code]


CC BY-SA 3.0
2015-03-28T03:33:11.253
8501
2015-03-28T03:33:11.253
7170
8427
answer