所以我有一個商業案例,我有組(稱爲Bundles),它們可以包含其他Bundles。現在,在我的界面中,我試圖讓它在檢查頂層時自動檢查(並禁用,但我還沒有)子包。Javascript Checkbox.OnChange事件沒有正確觸發
爲了達到這個目的,每個複選框都有一個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')" />
可能相關的替代
domEle.change();
:http://stackoverflow.com/questions/208471/getting-jquery-to-recognise-change-in-ie – 2010-08-27 18:40:13我使用的點擊和變化:/ – JustLoren 2010-08-27 18:45:35
離開'點擊'處理程序並刪除對「變更」的引用 - 這將重複該過程並可能產生意想不到的後果。也不要手動調用'.change()' – lincolnk 2010-08-27 18:59:50