2010-08-13 123 views
1

我面臨着一個奇怪的行爲,在jQuery 1.4與點擊事件。這個想法是點擊一個下拉列表(change()),然後使用它們的click()函數將兩個複選框的集合顛倒過來。
如果我必須這樣做,這是因爲複選框上的click更新了其他字段,所以我認爲不是反轉複選框checked屬性,而是調用兩次點擊所有複選框。jQuery奇怪的行爲()點擊()點擊()

儘管所有複選框都被正確反轉了兩次,但我在click函數上使用的.length在操作過程中失去了正確的計數,並且每次都返回1以上。

要在這裏明確是代碼的理念:

//The 'click' function 
$('input:checkbox').click(function(){ 
    $(this).parent().find("input:checkbox:checked").length;//<- this one's not returning the right count 
    //some code updating other fields thanks to the 'length' of the checkboxes 
}); 

//The dropdown function 
$('select.dropdown').change(function(){ 
    $(this).parent().find("input:checkbox").click();//Invert the first time 
    $(this).parent().find("input:checkbox").click();//Invert a second time 
}); 

當我手動檢查並取消領域,一切都可以正常使用,只是在下拉菜單中調用它的長度計數是錯誤的。

這裏有兩個場景,更解釋了深入的問題我遇到:

  1. 如果我選擇的東西從下拉列表中(長度失敗),然後取消並重新檢查複選框,則計數爲對。
  2. 如果我在click()函數的末尾添加了一個錯誤代碼,它除了在javascript調試器控制檯上引發錯誤外,還可以正常工作。順便說一句,我不能保留這個解決方案,因爲在這種情況下另一個函數失敗。


乾杯,
尼古拉斯。

回答

2

如果要反轉複選框的checked狀態,你可以這樣做:

$(this).parent().find("input:checkbox").attr('checked', function(i, sel) { 
    return !this.checked; 
}); 

請注意,調用.find("input:checkbox").attr(...將反轉所有複選框。所以如果你兩次調用它們,它們會翻轉兩次,讓你看起來沒有任何事情發生。


編輯:

如果一點是,你只是想觸發處理程序,您可以使用.triggerHandler()將觸發click而不觸發元素的默認行爲。

$(this).parent().find("input:checkbox").triggerHandler('click'); 

http://api.jquery.com/triggerhandler/

+0

但是,這將不會觸發複選框自己的onclick處理程序,因爲OP需要。 – 2010-08-13 15:28:51

+0

@Marc - 也許我誤解了這個問題。我認爲重點是如何反轉複選框狀態。如果OP需要運行附加的點擊處理程序,則將使用已經使用的方法。 – user113716 2010-08-13 15:33:17

+0

@Marc:確切地說。在這種情況下,click()將不會被調用,因此我將無法更新其他字段。 @帕特里克:這不僅僅是關於複選框。乾杯。 – Nicolas 2010-08-13 15:35:15

1

假設複選框和下拉共享相同的形式,爲什麼不這樣做?

function countCheckedBoxes(theForm){ 
    theForm.find("input:checkbox:checked").length;//<- this one's not returning the right count 
    //some code updating other fields thanks to the 'length' of the checkboxes 
}); 

//The 'click' function 
$('input:checkbox').click(function(){ 
    countCheckedBoxes($(this.form)); 
}); 

//The dropdown function 
$('select.dropdown').change(function(){ 
    countCheckedBoxes($(this.form)); 
}); 

那麼你就不是依靠在處理單擊事件嵌套的方式(我相信這是問題),你正在顯式運行'countCheckedBoxes()'函數,而不是依賴被點擊的複選框的副作用。

+0

嗨,其實我想過這個選項,但做了一個countCheckedBoxes函數(返回長度然後),沒有幫助。我覺得問題是,在某些時候,jQuerycount的長度在複選框的狀態爲'checked',而不應該是這種情況。 – Nicolas 2010-08-13 15:33:00

+0

不太清楚爲什麼countCheckBoxes函數需要返回計數,但如果您將解決方案添加到原始問題的末尾,這可能會變得很明顯。您在上述評論中描述的問題正是我的建議試圖避免的。即不觸發事件處理程序來實現與事件無關的事情。關鍵是將事件內部調用的函數與事件處理程序本身分離開來,從而可以在不將特定事件引入方程的情況下完成所需的工作。 – belugabob 2010-08-16 09:01:16