jQuery复选框事件处理

aeq*_*aeq 133 html checkbox jquery

我有以下内容:

<form id="myform">
   <input type="checkbox" name="check1" value="check1">
   <input type="checkbox" name="check2" value="check2">
</form>
Run Code Online (Sandbox Code Playgroud)

如何使用jQuery捕获发生的任何检查事件myform并告诉切换哪个复选框(并知道它是否打开或关闭)?

Dar*_*rov 233

$('#myform :checkbox').change(function() {
    // this will contain a reference to the checkbox   
    if (this.checked) {
        // the checkbox is now checked 
    } else {
        // the checkbox is now no longer checked
    }
});
Run Code Online (Sandbox Code Playgroud)

  • `this`已设置为复选框的DOM元素,因此`this.checked`就足够了.除非您计划操作它,否则您不需要为它创建另一个jQuery对象. (30认同)
  • 这绝不是最好的答案.如果您的输入有相应的标签(例如`<label for ='myInput'> Checkbox:</ label> <input id ='myInput'name ='myInput'type ='checkbox'/>`)并单击标签,将检查复选框,但不会调用此函数.你应该使用`.change()`事件 (26认同)
  • 点击不是接近*any*check事件的任何地方. (22认同)
  • 只是一个小小的提示.通过在选择器中使用input:复选框而不仅仅是:复选框,您将获得性能提升,因为后者被转换为通用选择器*:复选框. (17认同)
  • 这个答案没有完全提供答案 - 请参阅下面的Anurag的答案,这是一个更完整(和准确)答案.当然,这个答案部分是正确的,但如上所述,这不是最好的答案. (6认同)
  • 这个答案(被接受和最多的赞成)是不够的(几乎是错误的),因为op要求"*any*check event"和"click"只是一个 - 这个函数不会在其他复选框更改事件中被触发...当然,人们正在指出jQuery调用与普通JavaScript的性能影响(好像是几秒钟).见Anurag的回答. (5认同)

Anu*_*rag 128

使用更改事件.

$('#myform :checkbox').change(function() {
    // this represents the checkbox that was checked
    // do something with it
});
Run Code Online (Sandbox Code Playgroud)

  • 那是设计上的.以编程方式更改DOM元素的属性不会触发关联的事件处理程序.你必须手动触发它们. (14认同)
  • 这应该是选定的答案,它包括单击复选框的标签 (6认同)
  • 如果隐藏该复选框,则用户将无法与其进行交互.如果您有其他意义,请告诉我. (5认同)
  • 从jQuery文档:"因为`:checkbox`是一个jQuery扩展而不是CSS规范的一部分,使用`:checkbox`的查询不能利用本机DOM`querySelectorAll()`方法提供的性能提升.为了更好的性能在现代浏览器中,使用`[type ="checkbox"]`代替." (3认同)
  • 这不会触发 `$("input[name=check1]").prop('checked', true)`。请参阅http://jsfiddle.net/Z3E8V/2/ (2认同)

Gon*_*ing 47

有几个有用的答案,但似乎没有涵盖所有最新选项.为此,我的所有示例都满足匹配label元素的存在,并允许您动态添加复选框并在侧面板中查看结果(通过重定向console.log).

  • 监听click的事件checkboxes不是因为这将不允许键盘肘或做了匹配,其中的变化是一个好主意label被点击的元素.一直在听这个change活动.

  • 使用jQuery :checkbox伪选择器,而不是input[type=checkbox].:checkbox更短,更易读.

  • is()与jQuery :checked伪选择器一起使用来测试是否选中了复选框.这保证适用于所有浏览器.

附加到现有元素的基本事件处理程序

$('#myform :checkbox').change(function () {
    if ($(this).is(':checked')) {
        console.log($(this).val() + ' is now checked');
    } else {
        console.log($(this).val() + ' is now unchecked');
    }
});
Run Code Online (Sandbox Code Playgroud)

JSFiddle: http ://jsfiddle.net/TrueBlueAussie/u8bcggfL/2/

笔记:

  • 使用:checkbox选择器,这比使用更好input[type=checkbox]
  • 连接到事件注册时存在的匹配元素.

附加到祖先元素的委托事件处理程序:

委托事件处理程序设计用于元素可能尚不存在(动态加载或创建)并且非常有用的情况.他们责任委托给祖先元素(因此称谓).

$('#myform').on('change', ':checkbox', function () {
    if ($(this).is(':checked')) {
        console.log($(this).val() + ' is now checked');
    } else {
        console.log($(this).val() + ' is now unchecked');
    }
});
Run Code Online (Sandbox Code Playgroud)

JSFiddle: http ://jsfiddle.net/TrueBlueAussie/u8bcggfL/4/

笔记:

  • 这通过监听事件(在这种情况下change)来冒泡到不变的祖先元素(在这种情况下#myform).
  • 然后它将jQuery选择器(':checkbox'在本例中)仅应用于bubble链中的元素.
  • 然后,它将事件处理函数应用于仅导致该事件的匹配元素.
  • document如果没有其他更接近/方便的话,则使用默认连接委派的事件处理程序.
  • 不要使用body附加委托事件,因为它有一个错误(与样式有关)可以阻止它获取鼠标事件.

委托处理程序的结果是匹配元素只需要在事件时存在,而不是在事件处理程序注册时存在.这允许动态添加的内容以生成事件.

问:它慢了吗?

答: 只要事件处于用户交互速度,您就不必担心委托事件处理程序和直接连接的处理程序之间的速度差异可以忽略不计.授权的好处远远超过任何微小的缺点.委托事件处理程序实际上更快注册,因为它们通常连接到单个匹配元素.


为什么不prop('checked', true)开火change呢?

这实际上是设计的.如果它确实触发了该事件,您将很容易陷入无休止的更新状态.相反,在更改checked属性后,使用trigger(not triggerHandler)将更改事件发送到同一元素:

例如,trigger没有事件发生

$cb.prop('checked', !$cb.prop('checked'));
Run Code Online (Sandbox Code Playgroud)

JSFiddle: http ://jsfiddle.net/TrueBlueAussie/u8bcggfL/5/

例如,trigger正常变化事件被捕获

$cb.prop('checked', !$cb.prop('checked')).trigger('change');
Run Code Online (Sandbox Code Playgroud)

JSFiddle: http ://jsfiddle.net/TrueBlueAussie/u8bcggfL/6/

笔记:

  • 不要triggerHandler像一个用户建议的那样使用,因为它不会将事件冒泡到委托的事件处理程序.

JSFiddle: http ://jsfiddle.net/TrueBlueAussie/u8bcggfL/8/

虽然它为事件处理工作直接连接的元素:

JSFiddle: http ://jsfiddle.net/TrueBlueAussie/u8bcggfL/9/

用.triggerHandler()触发的事件不会冒泡DOM层次结构; 如果它们不是直接由目标元素处理的,它们什么都不做.

参考:http://api.jquery.com/triggerhandler/

如果有人有其他功能,他们认为不包含此功能,请建议添加.


All*_*ton 28

在jQuery(1.7)中使用新的'on'方法:http://api.jquery.com/on/

    $('#myform').on('change', 'input[type=checkbox]', function(e) {
        console.log(this.name+' '+this.value+' '+this.checked);

    });
Run Code Online (Sandbox Code Playgroud)
  • 事件处理程序将继续存在
  • 将捕获是否通过键盘更改了复选框,而不仅仅是单击

  • 只需在`.prop`调用之后添加`.triggerHandler('change');`.然后它将切换框并调用该事件. (6认同)

Cha*_*ann 6

承认提问者特别请求 jQuery 并且选择的答案是正确的这一事实,应该注意这个问题实际上并不需要jQuery。如果希望在没有它的情况下解决这个问题,可以简单地设置onClick他或她想要添加附加功能的复选框的属性,如下所示:

HTML:

<form id="myform">
  <input type="checkbox" name="check1" value="check1" onClick="cbChanged(this);">
  <input type="checkbox" name="check2" value="check2" onClick="cbChanged(this);">
</form>
Run Code Online (Sandbox Code Playgroud)

javascript:

function cbChanged(checkboxElem) {
  if (checkboxElem.checked) {
    // Do something special
  } else {
    // Do something else
  }
}
Run Code Online (Sandbox Code Playgroud)

小提琴:http : //jsfiddle.net/Y9f66/1/

  • 当然,将事件处理程序直接放在 HTML 中是可行的。但它与 DRY 和渐进增强方法直接冲突。更准确的答案是“您不需要 jQuery 来添加事件处理程序”,而是使用标准 JS 将点击处理程序附加到单独的 JS 文件中,而不是将 onclick 属性放在 HTML 中。这样做“有效”,但良好的编码实践要求您应该尽可能避免它(此时几乎总是如此,除非您必须支持 IE6 或其他东西,甚至 MS 都说您不应该再这样做) (5认同)

Thi*_*ker 5

$('#myform input:checkbox').click(
 function(e){
   alert($(this).is(':checked'))
 }
)
Run Code Online (Sandbox Code Playgroud)