0

我目前有 event.stopPropagation() 可以处理一些选择器,但现在我需要将这些选择器作为参数传递给 .on(),因为这些元素在 ajax 请求之后被替换。

在此处输入图像描述

这就是我所拥有和工作的(但是当 ajax 替换选择器元素时会中断):

$('.addSetMenu input, .addSetMenu select, .addSetMenu').on('click', function(event) {
    return event.stopPropagation();
});

我试图将选择器作为参数传递给 .on() 作为数据,因为 ajax 请求替换了所有这些元素,但它似乎无法正常工作:

   $(document).on('click', '.addSetMenu input, .addSetMenu select, .addSetMenu', function(event) {
     return event.stopPropagation();
  });
4

1 回答 1

1

您不能stopPropagation()在第二个代码示例中与委托事件处理结合使用。这是因为委托事件处理使用事件传播才能工作。因此,当您的事件冒泡到文档对象(它将由您的事件处理程序处理)时,它已经传播,因此您无法停止已经发生的传播。

这里真正的解决方案可能是了解您真正想要阻止的内容。如果您确实需要停止事件传播,那么每次用 ajax 替换内容时都必须重新绑定第一种类型的事件处理程序(注意不要得到任何重复的事件处理程序)。但是,如果我们知道您在stopPropagation()通话中真正想阻止什么,我们也许可以提供一个更简单的解决方案。

从您的 pasteBin 示例来看,我看到了三种可能性:

  1. 更改您的代码以处理单击和 stopPropagation 到关闭处理程序之前的公共父级。这可能是更好的解决方案,但我必须更多地了解您的 HTML 结构以及您使用 ajax 动态加载的内容,才能知道这是否可行以及哪些代码可以正常工作。
  2. resetMenu()在您的关闭处理程序(您的 pasteBin 示例中的代码)中,检查实际的单击目标,如果目标是选择器中的项目之一,则不要调用。您可以使用.is()事件目标上的方法来确定。
  3. 每次通过 ajax 重新加载内容时,使用.on()(您的第一个代码示例)的静态版本重新安装事件处理程序。
于 2012-06-27T18:52:00.793 回答