2014-10-07 57 views
-1

我有一个简单的HTML链接和Jquery代码,它可以防止默认的第一个地方。但后来我撤消preventDefault使用jQuery unbindJquery解除绑定不适用于高级/多选择器

$('body *').click(function(e){ 
e.stopPropagation(); 
e.preventDefault(); 
}); 


$('a').eq(0).unbind('click'); 
$('a')[0].click(); 

这工作不错。然而,当我wrape这样的段落中的链接:

<p><a href="http://www.iana.org/domains/example">More information...</a></p> 

当我指定这样的选择它不工作了:

$('p a').eq(0).unbind('click'); 

什么特别之处加入这个额外的选择?

实施例在的jsfiddle:http://jsfiddle.net/nb9Lck5p/2/

+0

在您的演示代码有'e.stopPropagation()',但你的问题的代码不会。为什么?你是否理解'.eq(0)'和'[0]'之间的区别? “不起作用”是什么意思? – 2014-10-07 16:27:24

+0

这肯定看起来类似于[你以前的问题](http://stackoverflow.com/questions/26239304/removing-event-preventdefault-on-click-doesnt-work) – 2014-10-07 16:31:29

回答

2

这是因为事件传播的...要卸下从a单击处理程序,但它仍然是在p(父元素)本,所以,当该事件被鼓泡父元素的点击处理程序被调用它调用默认阻止,从而防止默认行为从链接点击

的通过停止事件传播

$('body *').click(function (e) { 
 
    e.stopPropagation(); 
 
    e.preventDefault(); 
 
}); 
 

 

 
$('p a').eq(0).unbind('click').click(function(e){ 
 
    e.stopPropagation(); 
 
}); 
 
$('p a')[0].click();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<p> 
 
    <a href="http://www.iana.org/domains/example">More information...</a> 
 
</p>


但你已经使用解除绑定的方式是危险的,因为它会删除绑定到a元素的任何其他点击处理程序,使用namespacing代替

$('body *').on('click.myhandler', function(e) { 
 
    e.stopPropagation(); 
 
    e.preventDefault(); 
 
}); 
 

 

 
$('p a').eq(0).off('click.myhandler').click(function(e) { 
 
    e.stopPropagation(); 
 
}); 
 
$('p a')[0].click();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<p> 
 
    <a href="http://www.iana.org/domains/example">More information...</a> 
 
</p>

+0

@Youss是的...但是这是从父母..在这种情况下,从'p'元素不是'a' – 2014-10-07 16:31:04

+0

好吧,我现在明白了:)非常感谢你 – Youss 2014-10-07 16:31:33

+0

我认为你的信息不正确@ArunPJohny,在这种情况下,事件没有绑定在'p '或'a',它被绑在'body *'上。它的作用就像“触发点击'body *',并检查'(function(e){if($(e.target)== $('p a')|| $(e.target).closest( 'p a')。length> 0){triggerFunction();}})'。因此,他将事件绑定在'body *'上,他必须在'body *'上解除绑定事件 – Kai 2014-10-07 16:42:43

1

在你的小提琴,你绑定事件('body *'),但你解除'点击'事件'p a'选择器。在这种情况下,您必须解除/关闭'body *'上的事件,而不是'p''a'

$('p a:first').on('click', function(e){ 
    alert('click'); 
    e.stopPropagation(); 
    e.preventDefault(); 
}); 

$('p a:first').off('click'); 
$('p a')[0].click(); 

我推荐你使用.on.off,比.bind.unbind

+0

感谢您的开启和关闭+1 – Youss 2014-10-07 16:37:58