我有以下代码:
<form id="myform">
<input type="checkbox" name="check1" value="check1">
<input type="checkbox" name="check2" value="check2">
</form>
如何使用jQuery来捕获myform
中发生的任何复选框事件,并告诉我切换了哪个复选框(以及它是否被打开或关闭)?
$('#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
}
});
使用change事件。
$('#myform :checkbox').change(function() {
// this represents the checkbox that was checked
// do something with it
});
$("input[name=check1]").prop('checked', true)
。请参见 http://jsfiddle.net/Z3E8V/2/。 - Peter:checkbox
是 jQuery 的扩展而不是 CSS 规范的一部分,所以使用 :checkbox
进行查询时无法利用本地 DOM querySelectorAll()
方法提供的性能提升。为了在现代浏览器中获得更好的性能,请改用 [type="checkbox"]
。" - NXT有几个有用的答案,但似乎没有涵盖所有最新的选项。为此,我的所有示例还应考虑匹配的
监听复选框上的click事件不是一个好主意,因为这不允许键盘切换或更改匹配的
使用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');
}
});
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');
}
});
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/4/
change
)冒泡到不变的祖先元素(在本例中为#myform
)来实现。':checkbox'
)应用于气泡链中的元素。document
作为连接委派事件处理程序的默认值。body
附加委派事件,因为它有一个错误(与样式有关),可能会阻止它获得鼠标事件。委托处理程序的结果是,匹配的元素只需要存在于事件发生时,而不需要在事件处理程序注册时存在。这允许动态添加的内容生成事件。
Q:速度会慢吗?
A: 只要事件处于用户交互速度,您不需要担心委派事件处理程序和直接连接处理程序之间微不足道的速度差异。委派的好处远远超过任何小缺点。委托事件处理程序实际上是更快的注册,因为它们通常连接到单个匹配元素。
prop('checked', true)
不触发change
事件?这实际上是设计如此。如果它触发了该事件,您很容易陷入无休止更新的情况。相反,在更改已选中属性后,使用trigger
(而不是triggerHandler
)向同一元素发送一个更改事件:
例如,没有trigger
不会发生事件
$cb.prop('checked', !$cb.prop('checked'));
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/5/
例如,使用trigger
会捕获正常的更改事件。
$cb.prop('checked', !$cb.prop('checked')).trigger('change');
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/6/
Notes:
triggerHandler
,因为它无法将事件冒泡到一个被委托的事件处理程序。JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/8/
虽然对于一个直接连接到元素上的事件处理程序而言,它确实可以工作:
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/9/
使用.triggerHandler()触发的事件不会向DOM层次结构中上溯传播;如果它们没有被目标元素直接处理,则什么也不会发生。
参考资料:http://api.jquery.com/triggerhandler/
如果有人认为还有其他未涵盖的特性,请建议添加。
.trigger('change')
。非常感谢这个非常完整的答案! - Pierre使用 jQuery 中的新 'on' 方法 (1.7 版本):http://api.jquery.com/on/
$('#myform').on('change', 'input[type=checkbox]', function(e) {
console.log(this.name+' '+this.value+' '+this.checked);
});
$("input[name=check1]").prop('checked', true)
。请参见 http://jsfiddle.net/Z3E8V/2/。 - Peter.prop
调用之后添加.triggerHandler('change');
即可。这样它将切换该框并触发事件。 - Hanna<form id="myform">
<input type="checkbox" name="check1" value="check1" onClick="cbChanged(this);">
<input type="checkbox" name="check2" value="check2" onClick="cbChanged(this);">
</form>
JavaScript:
function cbChanged(checkboxElem) {
if (checkboxElem.checked) {
// Do something special
} else {
// Do something else
}
}
Fiddle: http://jsfiddle.net/Y9f66/1/
$('#myform input:checkbox').click(
function(e){
alert($(this).is(':checked'))
}
)
val()
无法告诉你 checked
是否为 true
。 - Walf我尝试了第一个答案的代码,但它没有起作用。不过我进行了一些尝试,这个代码对我有效。
$('#vip').change(function(){
if ($(this).is(':checked')) {
alert('checked');
} else {
alert('uncheck');
}
});
this
已经被设置为复选框的 DOM 元素,因此this.checked
就足够了。除非你打算操作它,否则不需要为它创建另一个 jQuery 对象。 - Walf<label for='myInput'>Checkbox:</label><input id='myInput' name='myInput' type='checkbox'/>
),并且单击标签,则将选中复选框,但不会调用此功能。您应该使用.change()
事件。 - Patrick