Javascript 我可以停止特定函数上的事件传播吗?

Javascript 我可以停止特定函数上的事件传播吗?,javascript,jquery,stoppropagation,Javascript,Jquery,Stoppropagation,我有一些div,其他开发人员用click事件名fn_来绑定它们 现在我想给它们添加一个新函数名为fn_stoppropagation 问题是当我在fn_stopPropagation中调用e.stopPropagation时,它也会在fn_传播中停止事件传播 如何在fn_传播中保持事件传播,但在添加的函数中停止传播?我知道通过ID向每个DIV添加事件和停止使用stopPropagation可以做到这一点,但我认为这不是一个好方法 小提琴: HTML: 单击“单击我”时,预期输出: prop

我有一些div,其他开发人员用click事件名fn_来绑定它们

现在我想给它们添加一个新函数名为fn_stoppropagation

问题是当我在fn_stopPropagation中调用e.stopPropagation时,它也会在fn_传播中停止事件传播

如何在fn_传播中保持事件传播,但在添加的函数中停止传播?我知道通过ID向每个DIV添加事件和停止使用stopPropagation可以做到这一点,但我认为这不是一个好方法

小提琴:

HTML:

单击“单击我”时,预期输出:

   propagation div3 called     // called
   stoppropagation div3 called // called
   propagation div2 called     // expected, but NOT called, 
   propagation div1 called     // expected, but NOT called, 

谢谢。

您拥有的是嵌套的div,每次处理都单击。因为它们是嵌套的,所以事件会冒泡——从最里面的div开始。因此,您不能停止传播并期望它向上传播冒泡。StopperPogation正是为了这个目的——停止向其他处理程序冒泡事件。

您拥有的是嵌套的div,每次处理单击。因为它们是嵌套的,所以事件会冒泡——从最里面的div开始。因此,您不能停止传播并期望它向上传播冒泡。StopperProgation正是为了这个目的——停止向其他处理程序冒泡事件。

您的方法是错误的,因为事件传播独立于事件处理程序,所以您不能为某些处理程序停止事件,也不能为其他处理程序停止事件

您可能认为仅对某些情况下才可以停止它是有意义的,但这是因为您的情况非常特殊:目标及其祖先具有相同的处理程序

但在更一般的情况下,冒泡事件触发事件处理程序,每个元素的事件处理程序可能不同,因此仅为某些处理程序停止事件传播没有意义

然后,正确的方法是修改事件处理程序而不是事件。 例如:

var stopped = false;
function fn_stoppropagation(e){
    if(stopped !== (stopped=true)){
        /* Code here */
    }
}

您的方法是错误的,因为事件传播独立于事件处理程序,所以您不能为某些事件停止事件,也不能为其他事件停止

您可能认为仅对某些情况下才可以停止它是有意义的,但这是因为您的情况非常特殊:目标及其祖先具有相同的处理程序

但在更一般的情况下,冒泡事件触发事件处理程序,每个元素的事件处理程序可能不同,因此仅为某些处理程序停止事件传播没有意义

然后,正确的方法是修改事件处理程序而不是事件。 例如:

var stopped = false;
function fn_stoppropagation(e){
    if(stopped !== (stopped=true)){
        /* Code here */
    }
}

传播发生在DOM中,它只能为整个元素打开或关闭,而不能为特定的事件处理程序打开或关闭

我的建议:将当前元素与以下元素进行比较:


传播发生在DOM中,它只能为整个元素打开或关闭,而不能为特定的事件处理程序打开或关闭

我的建议:将当前元素与以下元素进行比较:



试试看?这正是我所期望的。除了我错了之外,为什么你认为它是错的?可怜的例子是使用'div'作为选择器…选择器肯定比这更具体?函数不会冒泡,事件会冒泡。从任何处理程序停止事件都会停止它。它不能同时冒泡和不冒泡。@charlietfl:我认为OP这样做是为了给所有嵌套元素分配处理程序的一种简单方法,以便于说明。试试看?这正是我所期望的。除了我错了之外,为什么你认为它是错的?可怜的例子是使用'div'作为选择器…选择器肯定比这更具体?函数不会冒泡,事件会冒泡。从任何处理程序停止事件都会停止它。它不能同时冒泡和不冒泡。@charlietfl:我认为OP这样做是为了给所有嵌套元素分配处理程序的一种简单方法,以便于说明。对我来说,这似乎是一个很好的解决方案。可能需要一种重置的方法。这有什么帮助?因为fn_stoppropagation从来不会被多次调用。你能提供你的演示吗?@VikramRao:当然可以。。。当它冒泡到下一个指定了相同处理程序的元素时。@andyf抱歉,我忘记添加链接对我来说似乎是一个很好的解决方案。可能需要一种重置的方法。这有什么帮助?因为fn_stoppropagation从来不会被多次调用。你能提供你的演示吗?@VikramRao:当然可以。。。当它冒泡到下一个指定了相同处理程序的元素时。@andyf抱歉,我忘了添加链接谢谢,这就是我想要的want@andyf:您确定具有处理程序的最深元素永远不会有其他嵌套元素吗?比如在示例中添加嵌套的?如果真是这样,这就行不通了。@Blue Skys:这是个问题。。。也许我可以用$'div*'让它工作起来?@BlueSkies说得对。在这种情况下,可能使用$e.target.closestdiv[0]来代替?@andyf:您将把处理程序分配给从所有div继承的所有元素。只要你最终不在乎点击了什么元素,它可能会工作。谢谢你,这就是我想要的want@andyf:您确定具有处理程序的元素永远不会有其他网元吗
泰德元素?比如在示例中添加嵌套的?如果真是这样,这就行不通了。@Blue Skys:这是个问题。。。也许我可以用$'div*'让它工作起来?@BlueSkies说得对。在这种情况下,可能使用$e.target.closestdiv[0]来代替?@andyf:您将把处理程序分配给从所有div继承的所有元素。只要您最终不关心单击了哪个元素,它就可能工作。
var stopped = false;
function fn_stoppropagation(e){
    if(stopped !== (stopped=true)){
        /* Code here */
    }
}
function fn_stoppropagation(e){
  if (this===e.target) {
    // the following will only run for the target, not its ancestors
    alert('stoppropagation '+$(this).attr('id')+' called');
  }
}