点击事件被触发两次 - jquery

发布于 2024-10-11 10:10:42 字数 440 浏览 0 评论 0原文

我有以下简化的 html:

<div class="foo" style="width:200px; height:200px;">
  <input type="checkbox" />
</div>

<script type="text/javascript">
  $('.foo').click(function(){$(this).find('input:checkbox')[0].click();});
</script>

单击 200x200 div 'foo' 效果很好,并引发其中复选框的单击事件。

然而,当我准确地单击复选框本身时,它会触发其“正常”事件,加上上面的 jquery 绑定事件,这意味着复选框会检查自身,然后再次取消选中自身。

有没有一种简洁的方法来防止这种情况发生?

I have the following simplified html:

<div class="foo" style="width:200px; height:200px;">
  <input type="checkbox" />
</div>

<script type="text/javascript">
  $('.foo').click(function(){$(this).find('input:checkbox')[0].click();});
</script>

Clicking the 200x200 div 'foo' works well, and raises the click event for the checkbox inside it.

However when I exactly click the checkbox itself, it fires its 'normal' event, plus the jquery bound event above, meaning the checkbox checks itself, then unchecks itself again.

Is there a tidy way to prevent this from happening?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

我做我的改变 2024-10-18 10:10:42

怎么样:不使用 div,而是使用 。它在语义上更正确,完全符合您的要求,并且不需要 JavaScript。

此处的工作示例: http://jsfiddle.net/LhSG9/1/

How about this: instead of using a div, use a <label>. It's more semantically correct, does exactly what you want, and requires no JavaScript.

Working example here: http://jsfiddle.net/LhSG9/1/

萌辣 2024-10-18 10:10:42

事件泡沫。您需要测试单击的e.target

如果您只是想选中/取消选中该框,则应该设置其 checked 属性。

$('.foo').click(function( e ){
    if( e.target.tagName.toUpperCase() !== 'INPUT' ) {
        var cbox = $(this).find('input:checkbox')[0];
        cbox.checked = !cbox.checked;
    } 
});

编辑:修正了一些错误。

工作演示: http://jsfiddle.net/LhSG9/

Events bubble. You would need test the e.target that was clicked.

And if you're just trying to check/uncheck the box, you should set its checked property.

$('.foo').click(function( e ){
    if( e.target.tagName.toUpperCase() !== 'INPUT' ) {
        var cbox = $(this).find('input:checkbox')[0];
        cbox.checked = !cbox.checked;
    } 
});

EDIT: Fixed a couple mistakes.

Working demo: http://jsfiddle.net/LhSG9/

一笔一画续写前缘 2024-10-18 10:10:42

您需要停止单击复选框,这样它就不会冒泡到 div 中。

$('.foo input:checkbox').click(function(e){
    // will stop event from "bubbling"
    e.stopPropagation()
})

You need to stop the click on the checkbox so it does not bubble up to the div.

$('.foo input:checkbox').click(function(e){
    // will stop event from "bubbling"
    e.stopPropagation()
})
甩你一脸翔 2024-10-18 10:10:42

发生这种情况是因为当您单击复选框时,您也单击了 div,因为复选框位于其中。所以你应该做的是当用户点击 div 内部但没有点击复选框时捕获。如果用户单击该复选框,它将以其默认行为选中/取消选中

$('.foo:not(':checkbox')').click(function(){
    $(this).find('input:checkbox')[0].click();
});

It happens because when you click on the checkbox you are also clicking on the div because the checkbox is inside it. So what you should do is capture when the user clicks the inside the div but no the checkbox. If the user does click on the checkbox it will act with its default behavior checking/unchecking

$('.foo:not(':checkbox')').click(function(){
    $(this).find('input:checkbox')[0].click();
});
北凤男飞 2024-10-18 10:10:42

在 yiur $(document).ready function 中包含以下函数 -

为您的复选框提供一个 id say test - 然后 -

$('#test').click(function(){
return false;
});

include the following function in yiur $(document).ready function -

give an id say test to your checkbox then -

$('#test').click(function(){
return false;
});
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文