0

我有一个 Marionette ItemView 正在监听点击li;下面 UI 中 ItemViews 的所有单击事件都被父级上的单击处理程序忽略li

我找到了一种涉及调用的解决方法,e.stopPropagation但似乎实际的解决方案可能是针对锚标记而不是 li。

一些示例代码:

var LiView = Marionette.ItemView.extend({
    events : {
        'click' : function(e){
            console.log(e.target);
        }
    }
});

var AnchorView = Marionette.ItemView.extend({
    events : {
        'click' : function(e){
            e.preventDefault();
            console.log(e.target);
        }
    }
});

new LiView({el: 'li'});
new AnchorView({el: 'li a'});

如果没有stopPropagationli click 事件仍然会触发 - 就像当您有多个 jQuery click 处理程序时一样。问题是 e.target 将引用两个点击处理程序中的锚点——这是不受欢迎的。

关于更好地构建它的任何想法?

4

1 回答 1

1

我只是使用e.stopPropagation,因为这就是事件冒泡应该如何工作并且你想防止它冒泡。

由于您绑定到click您的LiView,因此没有办法绕过被调用的问题,除非您绑定到li不是该a或父级的特定内容a(因为冒泡在这里仍然是一个问题)。

另一种方法(我认为这很混乱)是检查LiView点击处理程序的内部e.targete.currentTarget确保它们是相同的(如果它li本身就是你想要点击的,除非其他元素冒泡是可取的):

events: {
  'click' : function(e) {
    if(e.target == e.currentTarget) {
      // the person actually clicked on the LI and not something inside of it.
    }
  }
}
于 2013-11-06T19:37:27.953 回答