2012-06-27 48 views
0

我目前有event.stopPropagation()在几个选择器上工作,但现在我需要将这些选择器作为参数传递给.on(),因为这些元素在ajax请求后被替换。如何将选择器作为数据参数传递给.on()和event.stopPropagation?

enter image description here

这是我和作品(但休息时替换AJAX的选择元素):

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

我试图通过选择的参数。对()作为数据,因为Ajax请求替换所有这些元素,但它似乎没有正确工作:

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

你会发现什么?你期望发生什么? – bhamlin

+1

如果'on()'绑定到'document',那么'事件'*已经*传播了..?除非我错过了这个*不能*的工作(如你所愿)。 –

+0

使用$('。addSetMenu输入,.addSetMenu select,.addSetMenu')。live('click',function(){..}); – Farahmand

回答

1

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

这里真正的解决方案可能是理解你真正想要停止的。如果您真的需要停止事件传播,那么每次用ajax替换内容时(必须小心不要获得任何重复的事件处理程序),必须重新绑定第一种类型的事件处理程序。但是,如果我们知道您真的想通过stopPropagation()呼叫阻止,我们可能会提供更简单的解决方案。

你的引擎收录例子来看,我看到三种可能性:

  1. 改变你的代码来处理点击和stopPropagation为共同的父你的亲密处理程序之前那。这可能是更好的解决方案,但我必须了解更多关于HTML结构的信息,以及您使用Ajax动态加载的内容,以了解此功能是否可行,以及代码的工作原理。
  2. 在您的关闭处理程序(pasteBin示例中的代码)中,检查实际的点击目标,如果目标是选择器中的某个项目,请不要调用resetMenu()。您可以使用事件目标上的.is()方法来确定。
  3. 每次通过ajax重新加载内容时,请使用静态版本.on()(您的第一个代码示例)重新安装事件处理程序。
+0

我想知道什么可能是可行的解决方案来维护event.stopPropagation以处理这些元素,即使它们被新元素替换? – SCS

+0

@SCS - 你想用'stopPropagation()'调用来防止什么? – jfriend00

+0

我有一个功能绑定到将关闭一个菜单。我正在使用event.stopPropagation的所有选择器,我试图保持从冒泡到html元素,并发射关闭该菜单的函数:http://pastebin.com/Y6Lp6bgS – SCS

相关问题