因此,我有一个业务案例,其中有组(称为 bundle ),并且它们可以包含其他 bundle 。现在,在我的界面中,我试图拥有它,以便当您检查顶层时,它会自动检查(并禁用,但我还没有)子包。
为了实现这一点,每个复选框都有一个 onchange 事件,它在其中传递 this
以及应检查的其他 Bundles 的逗号分隔列表。我在下面粘贴的代码表现出意外。也就是说,当我强制调用 Change 事件时(因为以编程方式操作选中状态不会引发 Change 事件),后续调用将使用与原始 Change 事件完全相同的参数使用过。
就好像当我调用 .change()
时,它传递了我的原始复选框(不是级联的复选框)和原始子项列表。
我已经输入了大量警报,关键警报说“即将触发 [正确复选框] 的更改”,但紧接着的下一个警报说“禁用 [原始/错误复选框] 引发的更改” .
关于为什么以编程方式引发 Change 事件会导致其参数变得困惑,有什么想法吗?
function disableChildren(chkBundle, childBundles) {
var bundleId = chkBundle.id.substr(chkBundle.id.lastIndexOf("chk"));
alert("disable raised for '" + bundleId + "' using children '" + childBundles + "'");
jQuery("#BundleList input:checkbox[id*=" + bundleId + "id]").attr("checked", chkBundle.checked);
var childIds = childBundles.split(",");
for (var i = 0; i < childIds.length; i++) {
jQuery("#BundleList input:checkbox[id$=chk" + childIds[i] + "]").each(function(index, domEle) {
if (domEle.checked != chkBundle.checked) {
alert('about to check ' + domEle.id);
domEle.checked = chkBundle.checked;
alert('about to trigger change for ' + domEle.id);
domEle.change();
alert('done triggering ' + domEle.id);
}
});
}
}
还有一个复选框的 html 示例:
<input id="BundleAssignment_rptMainBundle_ctl02_chk1"
type="checkbox" name="BundleAssignment$rptMainBundle$ctl02$chk1"
onchange="disableChildren(this,'7,8')" onclick="disableChildren(this,'7,8')" />
最佳答案
删除与 change
有关的任何内容。替换domEle.change();
与 domEle.click();
关于Javascript Checkbox.OnChange 事件未正确触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3587146/