2011-10-05 65 views
12

。點擊事件我有表頭中具有一個檢查所有的複選框,檢查表中的該列的所有複選框:jQuery的觸發器(「點擊」)不開火複選框

<input class="check-all" type="checkbox" id="masterCheck" /> 

然而,在我的其中一頁上,我想在頁面加載時自動檢查全選複選框。

要做到這一點,我已經嘗試引發觸發器(「點擊」)功能類似下面:

$(document).ready(function() { 
    if ($("#masterCheck").attr('checked')) { 
    } else { 
     $("#masterCheck").trigger('click'); 
    } 
}); 

這將檢查罰款的複選框,但不火的複選框我的自定義點擊事件與類。檢查 - 所有(下):

$(function() { 
    $('.check-all').click(function() { 
     $(this).parents('table:eq(0)').find(':checkbox').attr('checked', this.checked); 
    }); 
}); 

我也嘗試添加一個Javascript的setTimeout,以爲自定義點擊功能沒有被加載相當尚未,但它仍然沒有等待1後觸發自定義點擊功能,2和3秒。

在頁面加載後,我可以取消選中預先選中的複選框,然後重新選中該複選框以完美地檢查列中的所有複選框。

我是否必須在Document.ready上的jQuery上添加一些特殊的東西來允許它觸發自定義點擊事件?

*** EDIT1:

好吧,我已經嘗試我的頁面上添加正上方的document.ready函數的定義點擊事件,以確保它的加載(如前面定義點擊事件是在主.js文件在我的_Layout中使用)。除此之外,我已將我的複選框的類更改爲與我的新自定義點擊事件相對應,因此我不會與我的主.js文件中的那個相沖突。

<input class="check-allx" type="checkbox" id="masterCheck" /> 


// Check all checkboxes when the one in a table head is checked: 
    $(function() { 
     $('.check-allx').click(function() { 
      $(this).parents('table:eq(0)').find(':checkbox').attr('checked', this.checked); 
      alert(this); 
     }); 
    }); 
// Check for unchecked masterCheck 
    $(document).ready(function() { 
     if ($("#masterCheck").attr('checked')) { 
     } else { 
      //$("#masterCheck").trigger('click'); 
      $("#masterCheck").click(); 
     } 
    }); 

這似乎自定義click事件是進步之內把我的警覺,但無濟於事盡我所有的複選框選中應該像他們。注意:我還將觸發器('click')更改爲.click(),它們在我的情況下都做同樣的事情。

+0

正如你可能理論進一步測試自定義事件處理程序可能還沒有被定義的,你想你的支票上面直接定義自定義單擊處理程序,只是爲了讓這個問題的一個最小的版本? –

+0

Ben:我在上面的EDIT1中試過這個。它現在正在進入我的自定義點擊事件,但我所有的複選框仍然沒有按照他們的要求點擊。 – Lando

回答

31

更新:這隻適用於jQuery 1.8及以下版本。這是fixed in jQuery 1.9

問題是在jQuery中手動調用click()的工作方式與實際點擊不同。

當您實際單擊時,首先更改複選框狀態,然後調用您的點擊處理程序。

當您致電click()時,首先調用click處理程序,然後更改複選框狀態。

因此,當您撥打click時,在您的點擊處理程序中,this.checked仍然是錯誤的。您可以通過它change處理程序,而不是一個click處理的,這樣解決這個問題:

$('.check-allx').change(function() { 
    $(this).parents('table:eq(0)').find(':checkbox').attr('checked', this.checked); 
}); 

實際的手動點擊和jQuery之間的差異的更全面的解釋請參見In jQuery, why does programmatically triggering 'click()' on a checkbox not immediately check it?觸發的點擊。

+0

偉大的答案,完美地解釋了這種情況,並提供了一個可行的解決方案。 – prashn64

+0

很好的答案。我的解決方案是導入更新版本的jquery並點擊()。這是合流的,所以我別無選擇,只能保留舊的。在這裏看到如何使用2版本的jquery:http://stackoverflow.com/q/1566595/265877 – Alex

1

以編程方式設置checked屬性不會觸發相應的單擊事件,因此您在設置屬性時必須添加自己的.trigger('click')

+0

這就是當你通過代碼設置'checked'屬性時。但點擊代碼應該工作 - 檢查http://jsfiddle.net/FloydPink/sBJ8L/ –

0

好吧,考慮到我只需要該單個頁面上的功能,我已經輕鬆解決了問題,並避免嘗試一起啓動自定義點擊事件。

今天早上喝了一杯咖啡後,我對它有點清楚了。我已將此代碼添加爲解決方法。

$(document).ready(function() { 
     $('table#OHTable input[type=checkbox]').attr('checked', 'checked'); 
    }); 

這只是簡單地檢查我的表中的所有我的複選框,並在事後被點擊我的masterCheck時仍解僱正確的點擊事件。

2

實施例:

$("#recurrence").trigger('click'); 

的將在下面的複選框的狀態改變之後執行。

$("#recurrence").click(function() { 
    $(this).change(function(){ 
     if (this.checked) { 
      $(".recurr-section").show(); 
     } else { 
      $(".recurr-section").hide(); 
     } 
    });   
});