有没有办法使用jQuery的委托事件处理程序签名与多个委派目标?

时间:2014-06-04 23:27:00

标签: javascript jquery event-handling event-delegation

我非常喜欢使用jQuery的委托事件处理签名:

$('.container').on('click', '.button', function () {
  // do something
});

我也是使用多事件处理程序签名的忠实粉丝:

$('.container').on({
  click: function () {
    // do something
  },
  mouseover: function () {
    // do something else
  }
});

我想知道是否有办法将两者结合在一起。我希望能够处理同一根元素的多个不同后代的点击事件。

我的第一个猜测是我可以将第二个参数传递给处理程序函数,但是对arguments变量的检查显示除了事件对象之外没有其他数据进入。

是否有适应这种情况的设计模式,或者我只需咬紧牙关并继续这样做?

$('.container')
    .on('click', '.button-a', function () {
      // do something
    })
    .on('click', '.button-b', function () {
      // do another thing
    })
    .on('click', '.button-c', function () {
      // do yet another thing
    });

3 个答案:

答案 0 :(得分:2)

我会使用事件Object来检查被点击的元素。

根据点击的元素执行代码块。

$('.container').on('click', function(e) {
     var $target = $(e.target);

    if($target.hasClass('button-a')) {
        // do something
    } else if($target.hasClass('button-b')) {
        // do another thing
    } else if($target.hasClass('button-c')) {
         // do yet another thing
    }
});

答案 1 :(得分:1)

在这种情况下,您可以用“,”分隔。

像这样:

 $('.container')
        .on('click', '.button-a, .button-b, .button-c', function () {
          // do something
        });

但这是因为你正在使用相同的事件。

如果要组合多事件签名,可以这样做:

$('.container .button-a, .container .button-b, .container .button-c, ').on({
  click: function () {
    // do something
  },
  mouseover: function () {
    // do something else
  }
});

答案 2 :(得分:0)

进入委托回调函数后,您可以使用属性 type 来检测触发了什么类型的事件,然后您可以观看 id className 从元素中检测id或类。 还要记住,您可以向将要接收事件的选择器添加多个类或id,也可以添加一个或多个事件。我理解你的容器是DOM树中将接收事件的最上层元素。  您可以从firebug或chrome web inspector中将下面的代码复制并粘贴到控制台中。然后单击此网页上的顶部导航。如果不是你已经知道的话,你会看到会发生什么!另请注意,如果您点击每个 li 元素的间隙(margin-right:7px空格),您将从所有这些元素中触发类容器( .nav )按钮(问题 | 标签 ... | 未答复)。

   $('.container').on('focusout click', ".nav" , function (e) {
    //attached to prevent the stackoverflow itself events attached to this elements
    e.preventDefault();
    e.stopPropagation();
    var className = e.target.className;
    var id = e.target.id;
    if ( e.type === 'click'){
        if ( id === 'nav-questions') {
            // do something
            console.log('clicked: from ' + id + '\n' );
        }
        if ( className=== 'nav mainnavs'){
            // do something
            console.log('clicked: from ' + className + '\n');
        }
        else {
            var selector = id || className;
            console.log('clicked: from ' + selector + '\n');
        }
    }
    if ( e.type === 'focusout'){
        console.log('focusout from ' + id);
    }
});