所以我有一个商业案例,我有团体(称为Bundles),他们可以包含其他Bundles。现在,在我的界面中,我正试着这样做,当你检查顶层时,它会自动检查(并禁用,但我还没有)子包。
为了实现这一点,每个复选框都有一个onchange事件,它在this
中传递,以及一个逗号分隔的应该检查的其他Bundle列表。我在下面粘贴的代码表现出乎意料。也就是说,当我强制调用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')" />
答案 0 :(得分:3)
删除与change
有关的任何内容。将domEle.change();
替换为domEle.click();