单击使用jQuery切换


70

我使用了一个悬停功能,您可以在mouseover上执行x,并在y和mouseout上执行x。我正在尝试相同的点击,但似乎不起作用:

$('.offer').click(function(){ 
  $(this).find(':checkbox').attr('checked', true ); 
},function(){
  $(this).find(':checkbox').attr('checked', false ); 
});

我希望在单击时选中该复选框div,并在再次单击时取消选中-单击切换。


这里是一个教程如何创建jQuery插件转换单选按钮进入切换按钮,并在这里你可以看到演示。希望它可以对您或其他用户有所帮助
Gopal Joshi

Answers:


214

通过在每次单击时翻转复选框的当前“已选中”状态,可以轻松完成此操作。例子:

 $(".offer").on("click", function () { 
       var $checkbox = $(this).find(':checkbox');
       $checkbox.attr('checked', !$checkbox.attr('checked'));
 });

要么:

 $(".offer").on("click", function () { 
       var $checkbox = $(this).find(':checkbox');
       $checkbox.attr('checked', !$checkbox.is(':checked'));
 });

或者,通过直接操作DOM的“ checked”属性(即不attr()用于获取被单击复选框的当前状态):

 $(".offer").on("click", function () { 
       var $checkbox = $(this).find(':checkbox');
       $checkbox.attr('checked', !$checkbox[0].checked);
 });

...等等。

注意:从jQuery 1.6开始,应该使用propnot来设置复选框attr

 $(".offer").on("click", function () { 
       var $checkbox = $(this).find(':checkbox');
       $checkbox.prop('checked', !$checkbox[0].checked);
 });

我不建议将元素的DOM属性设置为布尔值。大概'1'在该过程中将其转换为字符串。
亚历克斯·巴雷特

2
@Alex Barrett-没关系,jQuery将这些细节扫地出门。我相信使用attr()将布尔属性(如selecteddisablechecked)设置为布尔值是一种常见的做法。此外,它们的内部表示是布尔值,alert($ foo.attr('checked'))将返回true或false,无论是否使用字符串或布尔值对其进行设置。
karim79

8
我遇到过这样的情况,您实际上需要完全删除“选中”属性才能取消选中该框。在这种情况下,这些都不起作用。
杰里米·霍洛瓦奇

@杰里米-您能提供一个可行的例子吗?听起来像是一个奇怪的边缘情况。
karim79 2011年

1
当您只需单击每个复选框时,为什么要以这种复杂的方式来反转属性:... $(this).find(':checkbox').click(); ...
vladko13 2015年

27

另一种方法是像这样扩展jquery:

$.fn.toggleCheckbox = function() {
    this.attr('checked', !this.attr('checked'));
}

然后致电:

$('.offer').find(':checkbox').toggleCheckbox();

2
我喜欢它,因为它也适用于一系列复选框。+1
蒂诺

您应该添加this.trigger('change');onChange事件,否则不会被触发。
Frozen_byte 2015年

11

警告:在大多数经过测试的浏览器中,使用attr()prop()更改复选框的状态不会触发更改事件。选中状态将更改,但不会发生任何事件冒泡。设置选中的属性后,您必须手动触发更改事件。我还有其他一些事件处理程序可以监视复选框的状态,并且它们在用户直接单击时可以正常工作。但是,以编程方式设置检查状态无法始终触发更改事件。

jQuery 1.6

$('.offer').bind('click', function(){ 
    var $checkbox = $(this).find(':checkbox');
    $checkbox[0].checked = !$checkbox[0].checked;
    $checkbox.trigger('change'); //<- Works in IE6 - IE9, Chrome, Firefox
});

1
您也可以直接触发click事件。
davenpcj 2012年

7

您可以使用以下toggle功能:

$('.offer').toggle(function() {
    $(this).find(':checkbox').attr('checked', true);
}, function() {
    $(this).find(':checkbox').attr('checked', false);
});


2

为什么不一行?

$('.offer').click(function(){
    $(this).find(':checkbox').attr('checked', !$(this).find(':checkbox').attr('checked'));
});

1

我有一个名为的复选框chkDueDate和一个带有click事件的HTML对象,如下所示:

$('#chkDueDate').attr('checked', !$('#chkDueDate').is(':checked'));

单击HTML对象(在本例中为a <span>)可切换复选框的checked属性。


1

jQuery:最好的方法,将动作委派给jQuery(jQuery = jQuery)。

$( "input[type='checkbox']" ).prop( "checked", function( i, val ) {
    return !val;
});

0

尝试更改此:

$(this).find(':checkbox').attr('checked', true ); 

对此:

$(this).find(':checkbox').attr('checked', 'checked'); 

不确定100%是否会这样做,但我似乎还记得有类似的问题。祝好运!


0
$('.offer').click(function(){ 
    if ($(this).find(':checkbox').is(':checked'))
    {
        $(this).find(':checkbox').attr('checked', false); 
    }else{
        $(this).find(':checkbox').attr('checked', true); 
    }
});



0

最简单的解决方案

$('.offer').click(function(){
    var cc = $(this).attr('checked') == undefined  ? false : true;
    $(this).find(':checkbox').attr('checked',cc);
});

关。第一次单击时将为“未定义”,并指定值“ false”。然后将在第二次单击时对其进行定义,并为其分配值“ true”。第三次单击,仍将对其进行定义,因此仍将其分配为“ true”。
凯文C.

0
<label>
    <input
        type="checkbox"
        onclick="$('input[type=checkbox]').attr('checked', $(this).is(':checked'));"
    />
    Check all
</label>

0

切换复选框值的另一种替代解决方案:

<div id="parent">
    <img src="" class="avatar" />
    <input type="checkbox" name="" />
</div>


$("img.avatar").click(function(){

    var op = !$(this).parent().find(':checkbox').attr('checked');
    $(this).parent().find(':checkbox').attr('checked', op);

});

0
    $('controlCheckBox').click(function(){
    var temp = $(this).prop('checked');
    $('controlledCheckBoxes').prop('checked', temp);
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.