jQuery:函数被调用两次。传播?为什么会出现这种情况?

标签 jquery stoppropagation

请看一下下面的 fiddle :http://jsfiddle.net/K9NjY/

我在这段代码上花了 3-4 个小时,并将其缩小到最短的版本,但现在我陷入了困境。

问题: 1. 点击“divOne” 2.点击切换DivNames 3. 单击“divTwo”

*为什么 divOne 仍然收到警报?我该如何阻止这个? * 逻辑告诉我,当我们点击 divTwo 时,我们应该只收到一个显示“divTwo”的提醒

请注意,doSomething() 有一个由其中的点击 触发的函数。这不能更改,即 $("."+ divName).click(function(){...}); 必须保留在 doSomething()

对此我能做什么?

最佳答案

事件绑定(bind)到元素而不是它们的类名,每当调用该函数时,您都会将单击处理程序附加到匹配的元素。这就是为什么您会看到多个处理程序被调用的原因。您可以通过使用传递的参数来使用事件委托(delegate),也可以使用 off 方法来删​​除处理程序。

编辑:通常,当您将多个处理程序附加到一个元素时,您会做错什么。将事件处理程序附加到其他处理程序中会带来痛苦。逻辑应该移到处理程序的主体中。

在这种情况下我可能会这样做:

var $e = $(".action").on('click', function() {
     var action = $(this).data('action');
     // Do something based on the element's current `action` datum
     if (action === 'whatever') {
       // ...
     } else {
       // ...
     }
});

function doSomething(divName) {
    $e.html(divName).data('action', divName);
}

这里的action数据可以在处理程序的逻辑中使用。

关于jQuery:函数被调用两次。传播?为什么会出现这种情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24348443/

相关文章:

javascript - 无法隐藏由 javascript 创建的 div

javascript - React 通过 onclick 调用组件

javascript - Bootstrap 中的类 FORM-CONTROL 在数据表中使用时不会生效

javascript - 在固定部分内使用窗口滚动 float Div

jquery - 在点击事件中使用 stopPropagation

javascript - (包括 JSFIDDLE)sweet alert js - 按钮交换(确认按钮在左边,取消按钮在右边)

jquery - 如何在ajax加载的元素上绑定(bind)事件

javascript - event.stopPropagation Firefox

即使使用 event.stopPropogation、event.preventDefault 和 return false,jQuery 也无法在返回键上停止表单提交

jquery - 使用 jquery/javascript 停止带有动画的函数