jQuery复选框选中状态改变事件

IT技术 javascript jquery event-handling
2021-02-06 09:04:33

当复选框被选中/取消选中时,我想要一个事件来触发客户端:

$('.checkbox').click(function() {
  if ($(this).is(':checked')) {
    // Do stuff
  }
});

基本上我希望它发生在页面上的每个复选框中。这种点击触发并检查状态的方法好吗?

我认为必须有一种更清洁的 jQuery 方式。有谁知道解决办法?

6个回答

绑定到change事件而不是click. 但是,您可能仍需要检查是否选中了复选框:

$(".checkbox").change(function() {
    if(this.checked) {
        //Do stuff
    }
});

绑定到change事件click而不是事件的主要好处是并非所有单击复选框都会导致其更改状态。如果您只想捕获导致复选框更改状态的事件,则需要恰当命名的change事件。 在评论中编辑

另请注意,我使用this.checked而不是将元素包装在 jQuery 对象中并使用 jQuery 方法,仅仅是因为直接访问 DOM 元素的属性更短、更快。

编辑(见评论)

要获取所有复选框,您有几个选项。您可以使用:checkbox伪选择器:

$(":checkbox")

或者您可以使用属性等于选择器:

$("input[type='checkbox']")
这比$(this).is(':checked'). 我认为change如果您想检测键盘的更改(制表符,击中空格),您必须使用该事件,但令人惊讶的是,click还检测到不是来自鼠标单击的更改,不确定它是否是 jQuery 的事情,jsfiddle.net /mendesjuan/E39sz
2021-03-17 09:04:33
@Vigrond - 实际上,单击标签会触发关联控件上的单击事件:jsfiddle.net/ZFG84
2021-03-20 09:04:33
@AnonyMouse - 查看我的编辑。有几种方法可以做到这一点。
2021-03-29 09:04:33
请注意:绑定任何情况下clickchange或任何页面上的所有复选框可能会导致性能问题(depepending上复选框的量)。尝试绑定到父元素或文档并捕获冒泡事件,即$('form').on('change', ':checkbox', function(){ //stuff });
2021-03-30 09:04:33
实际上,我已经找到了class的复选框。有没有更好的方法来获取所有复选框而不考虑类?
2021-04-03 09:04:33

为了将来参考这里有困难的任何人,如果您动态添加复选框,则上面的正确接受答案将不起作用。您需要利用允许父节点从特定后代捕获冒泡事件并发出回调的事件委托

// $(<parent>).on('<event>', '<child>', callback);
$(document).on('change', '.checkbox', function() {
    if(this.checked) {
      // checkbox is checked
    }
});

请注意,它几乎总是没有必要document用于父选择器。而是选择一个更具体的父节点,以防止将事件传播到太多级别。

下面的示例显示了动态添加的 dom 节点的事件如何不触发先前定义的侦听器。

$postList = $('#post-list');

$postList.find('h1').on('click', onH1Clicked);

function onH1Clicked() {
  alert($(this).text());
}

// simulate added content
var title = 2;

function generateRandomArticle(title) {
  $postList.append('<article class="post"><h1>Title ' + title + '</h1></article>');
}

setTimeout(generateRandomArticle.bind(null, ++title), 1000);
setTimeout(generateRandomArticle.bind(null, ++title), 5000);
setTimeout(generateRandomArticle.bind(null, ++title), 10000);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<section id="post-list" class="list post-list">
  <article class="post">
    <h1>Title 1</h1>
  </article>
  <article class="post">
    <h1>Title 2</h1>
  </article>
</section>

虽然此示例显示了使用事件委托来捕获特定节点(h1在本例中)的事件,并为此类事件发出回调。

$postList = $('#post-list');

$postList.on('click', 'h1', onH1Clicked);

function onH1Clicked() {
  alert($(this).text());
}

// simulate added content
var title = 2;

function generateRandomArticle(title) {
  $postList.append('<article class="post"><h1>Title ' + title + '</h1></article>');
}

setTimeout(generateRandomArticle.bind(null, ++title), 1000); setTimeout(generateRandomArticle.bind(null, ++title), 5000); setTimeout(generateRandomArticle.bind(null, ++title), 10000);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<section id="post-list" class="list post-list">
  <article class="post">
    <h1>Title 1</h1>
  </article>
  <article class="post">
    <h1>Title 2</h1>
  </article>
</section>

惊人。我刚刚在这里了解了一些更多的基础知识。
2021-03-23 09:04:33
注意:对于父级(在上面的示例中:#post-list),您必须使用不是动态创建的文档元素。就我而言,是包含局部视图的 div。
2021-04-05 09:04:33
这解释了“为什么”我的点击事件不起作用 - 谢谢!!
2021-04-07 09:04:33

只是另一种解决方案

$('.checkbox_class').on('change', function(){ // on change of state
   if(this.checked) // if changed state is "CHECKED"
    {
        // do the magic here
    }
})
虽然此代码可能会回答问题,但提供有关此代码为什么和/或如何回答问题的附加上下文可提高其长期value。
2021-04-06 09:04:33

如果您的意图是仅在选中的复选框上附加事件(因此当它们被取消选中并稍后再次选中时会触发),那么这就是您想要的。

$(function() {
    $("input[type='checkbox']:checked").change(function() {

    })
})

如果您打算将事件附加到所有复选框(选中和未选中)

$(function() {
    $("input[type='checkbox']").change(function() {

    })
})

如果您希望它仅在它们被检查(从未检查)时触发,那么@James Allardice 在上面回答。

BTWinput[type='checkbox']:checked是 CSS 选择器。

@FrenkyB 尝试以下操作: $("input[type='checkbox']:not(:checked)")
2021-03-15 09:04:33
如果您只想找到未选中的复选框怎么办?我为所有选中的 $("#tableUSNW tbody tr td[id=td1] :checkbox:checked"); 但我不知道如何找到所有未检查的。
2021-03-23 09:04:33
$(document).ready(function () {
    $(document).on('change', 'input[Id="chkproperty"]', function (e) {
        alert($(this).val());
    });
});