【发布时间】:2018-03-06 08:37:04
【问题描述】:
我在理解 jQuery().change() 行为时遇到了一些问题。
HTML 基本上是很多输入元素 - 复选框(每个 ID 为 id^='o99-post-visible-XXX' - 它们是纯 CSS 图像作为复选框,但这无关紧要),我还有另一个复选框 ("#o99-check-all") 用于“检查all”和一个文本输入字段 ('#o99-post-visible-ids'),用于接收所选框的 ID。
jQuery代码如下:
jQuery(document).ready(function() {
jQuery("#o99-check-all").change(function () {
jQuery("input:checkbox[id^='o99-post-visible-']").prop('checked', jQuery(this).prop("checked")).trigger('change');
});
var checkboxes = jQuery("input.o99-cbvu-posts-checkbox:checkbox");
checkboxes.on('change', function() {
// get IDS from all selected checkboxes and make a comma separated string
var ids = checkboxes.filter(':checked').map(function() {
return this.value;
}).get().join(',');
// put IDS inside a text input field
jQuery('#o99-post-visible-ids').val(ids);
// console.log(ids);
});
});
现在,或多或少现在一切正常,但这不是问题。
起初,第一段代码是:
jQuery("#o99-check-all").change(function () {
// without .trigger('change') chained
jQuery("input:checkbox[id^='o99-post-visible-']").prop('checked', jQuery(this).prop("checked"));
});
它没有工作(为什么??) - 表示按预期选择了框,但 '#o99-post-visible-ids' 输入字段没有收到 ID - 直到我链接了一个 .trigger('change') 事件 - 突然它工作正常。
我的困惑在于以下(对于我对 jQuery 内部工作的一点了解,这可能是违反直觉的)
在链添加 .trigger('change') 之后 - 这难道不是一个无限循环,其中 chain() 事件在 change() 的侦听器内触发?如果不是,为什么?
为什么代码现在可以正常运行而以前不能正常运行?因为再次,据我了解,即使不是由用户直接点击触发,也会发生变化。为什么需要手动触发?
【问题讨论】:
-
通过代码检查/取消选中复选框不会引发事件,请参阅jsfiddle.net/wzkr5gtf
-
@Viney - 谢谢,这可以解释它(或多或少像 Bram Vanroy 的回答),但如果
.trigger('change')确实会引发事件 - 那让我感到困惑的“无限循环”呢? -
我没有看到任何循环,触发器被一个一个地调用每个复选框
-
这可能是我的误解。在第一个块中,
.change(function ..()嵌套了.trigger('change')事件。
标签: javascript jquery events onchange