2010-10-05 118 views
26
点击时忽略单击事件

所以,我有以下情形:如何对儿童

<div id="block"> 
Sample text. 
<a href="#">Anchor link</a> 
</div> 

<script type="text/javascript"> 
    $("#block").click(function() { alert('test'); }); 
</script> 

当我点击的div内的任何地方,我发现了“测试”的警报。但是,我想要防止发生这种情况,当我点击“锚链接”。我怎样才能实现呢?

谢谢

回答

27

您可以停止从链接冒泡了一个额外的处理器,这样的点击次数:

$("#block a").click(function(e) { e.stopPropagation(); }); 

在我们的意见在讨论替代:

$("#block").delegate('a', 'click', function(e){ e.stopImmediatePropagation(); }) 
      .click(function() { alert('test'); });​ 

这将防止任何儿童冒泡链接(当然,不是真的,但是从执行的处理程序),但不是对每个元素创建一个处理程序,这是通过.stopImmediatePropagation()完成。

+4

感觉有点“矫枉过正”的点击处理程序添加到每个环节只是为了防止事件传播(当然这取决于链接的数量)。但这是防止任何特定元素事件传播的好方法。 – 2010-10-05 13:46:04

+0

@Felix - 如果有很多环节我会采取不同的方法完全与一组.delegate的'()'处理:)(你可以用上面* *前的其他点击处理程序的委托版本,以及) 。 – 2010-10-05 13:48:03

+0

我刚刚尝试过'delegate()',它对我不起作用:http://jsfiddle.net/cxcfA/。我假设因为这个事件已经冒出来了。或者你的意思是别的吗? – 2010-10-05 13:57:51

14

这就是你需要的:http://api.jquery.com/event.target/

只是相比较,以检查是否元素被你想要的元素或它的一个子触发。

+1

在我看来,最好的解决办法... – Arxeiss 2013-06-27 13:55:08

3
$("#block").click(function(event) { 
    if($(event.target).attr('id') == $(this).attr('id')) 
    { 
     alert('test'); 
    } 
}); 
+0

工作过。谢谢! – hiroki 2017-02-06 17:32:27

0

这里是一个演示(jsfiddle)用表格和两个字段:

<div id="container"> 
    <form> 
     <div class="field"> 
      <input id="demo" type="text" name="demo" /> 
     </div> 
     <div class="field"> 
      <input id="demo2" type="text" name="demo2" /> 
     </div> 
    </form> 
</div> 

的代码看起来是这样的:

$(document).ready(function() { 
    $('#container').click(function(evt) { 
     if(this == evt.target) { 
      console.log('clicked container',evt.target); 
      $('#demo').focus(); 
     } else { 
      console.log('clicked child -> ignoring'); 
     } 
    }); 

    $('.field').click(function(evt) { 
     if(this == evt.target) { 
      console.log('clicked field div',evt.target); 
      $(this).find('input').focus(); 
     } else { 
      console.log('clicked child -> ignoring'); 
     } 
    }); 
}); 

您可以单击包含表单的容器将焦点设置在第一个输入字段或输入字段后面以将焦点置于其中。

如果你点击进入该领域,然后点击将被忽略。

上面的代码工作,因为jQuery的调用事件处理程序之前分配DOM节点this,所以你可以很容易地检查通过检查

this == evt.target 

CSS当前事件是否由DOM节点发布:

#container { 
    width: 600px; 
    height: 600px; 
    background: blue; 
} 

.field { 
    background: green; 
}