2010-08-27 146 views
0

所以我有一個商業案例,我有組(稱爲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')" /> 
+0

可能相關的替代domEle.change();:http://stackoverflow.com/questions/208471/getting-jquery-to-recognise-change-in-ie – 2010-08-27 18:40:13

+0

我使用的點擊和變化:/ – JustLoren 2010-08-27 18:45:35

+1

離開'點擊'處理程序並刪除對「變更」的引用 - 這將重複該過程並可能產生意想不到的後果。也不要手動調用'.change()' – lincolnk 2010-08-27 18:59:50

回答

3

刪除任何與change。與domEle.click();

+0

tyvm - .click導致針對onclick註冊的事件與預期參數一起引發 – JustLoren 2010-08-27 19:20:00