Javascript event.stopPropagation()出现故障(&;onClick(jQuery)
我几年前写过这段代码,当时它在FF&Chrome中工作,但现在,它在Chrome中产生了无限循环Javascript event.stopPropagation()出现故障(&;onClick(jQuery),javascript,jquery,javascript-events,Javascript,Jquery,Javascript Events,我几年前写过这段代码,当时它在FF&Chrome中工作,但现在,它在Chrome中产生了无限循环 <script> function clickChildLink(el, event) { console.log('inside function'); var evtTarget = $(event.target); if (evtTarget.is('a')) { console.log('return
<script>
function clickChildLink(el, event) {
console.log('inside function');
var evtTarget = $(event.target);
if (evtTarget.is('a')) {
console.log('returning');
return; //ignore clicks if its a link
}
$(el).children('a').click();
}
</script>
<div onclick="clickChildLink(this, event);">
<a href="#" onclick="console.log('before'); event.stopPropagation(); console.log('after'); return false;">Header</a>
</div>
函数clickChildLink(el,事件){
log(“内部函数”);
var evtTarget=$(event.target);
if(evtTarget.is('a')){
console.log('returning');
return;//如果是链接,则忽略单击
}
$(el).children('a')。单击();
}
您可以在此处运行代码:
基本上,它应该做的是,如果用户在div(即标题)内单击,它会在其中找到链接,并调用对它的单击。在Chrome上,调用的点击也会传播回父级,父级又会再次启动整个过程
我知道我应该使用不那么显眼的javascript,但这源于一个旧的rails应用程序(希望很快就能升级)
你知道为什么这个事件没有停止传播吗?从技术上讲,代码应该在没有stopPropagation调用的情况下工作,因为函数中的if语句应该阻止后续调用的触发。显然,当通过编程方式调用click时,Chrome不会更新currentTarget,如果只有一个子锚点,那么您可以不执行以下操作吗
$(el).click(function(){
if (this.tagName !== 'A')
this.getElementsByTagName('A')[0].click();
});
或者我猜如果它嵌套在更深的地方
$(el).click(function(){
if (this.tagName !== 'A')
$('a', this)[0].click();
});
看起来这是由内联附加的事件处理程序引起的。如果您使用jQuery、onDomReady附加它们,它应该可以工作,而且更好的是跨浏览器(您当前的脚本在IE中无法正常工作,我可以看到一件事:Firefox将事件视为属于
a
元素,而Chrome相信它属于div
。以下是控制台中显示事件的相同代码;我还停止循环以保存理智;)
。谢谢Jared…事后看来,我看到代码可能有点烦人。我不确定当您以编程方式调用click事件时,Chrome为什么不更新目标。谢谢…这最终起到了作用…奇怪的是,事件中的currentTarget是使用此方法正确更新的。
$(function(){
$(div).click(function(){
$(this).children('a').click();
});
$(a).click(function(e){
e.stopPropagation();
});
});