Javascript Checkbox.OnChange事件未正确触发

时间:2010-08-27 18:37:59

标签: javascript jquery html

所以我有一个商业案例,我有团体(称为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')" />

1 个答案:

答案 0 :(得分:3)

删除与change有关的任何内容。将domEle.change();替换为domEle.click();