2010-02-09 33 views
57

Tôi cần trợ giúp với bộ chọn jQuery. Giả sử tôi có đánh dấu như được hiển thị bên dưới:Chọn tất cả các hộp kiểm với jQuery

<form> 
    <table> 
     <tr> 
      <td><input type="checkbox" id="select_all"/></td> 
     </tr> 
     <tr> 
      <td><input type="checkbox" name="select[]"/></td> 
     </tr> 
     <tr> 
      <td><input type="checkbox" name="select[]"/></td> 
     </tr> 
     <tr> 
      <td><input type="checkbox" name="select[]"/></td> 
     </tr> 
    </table> 
</form> 

Cách nhận tất cả các hộp kiểm ngoại trừ #select_all khi người dùng nhấp vào hộp kiểm?
Mọi trợ giúp sẽ được đánh giá cao.

Trả lời

83

Một hoàn chỉnh hơn ví dụ sẽ hoạt động trong trường hợp của bạn:

$('#select_all').change(function() { 
    var checkboxes = $(this).closest('form').find(':checkbox'); 
    checkboxes.prop('checked', $(this).is(':checked')); 
}); 

Khi hộp kiểm #select_all được nhấp, trạng thái của hộp kiểm được chọn và tất cả các hộp kiểm trong biểu mẫu hiện tại được đặt thành cùng trạng thái.

Lưu ý rằng bạn không cần phải loại trừ hộp kiểm #select_all khỏi lựa chọn vì sẽ có cùng trạng thái như tất cả những người khác. Nếu bạn đối với một số lý do cần phải loại trừ #select_all, bạn có thể sử dụng này:

var checkboxes = $(this).closest('form').find(':checkbox').not($(this)); 
+1

Cảm ơn, Tatu! Đó là những gì tôi cần – Darmen

+14

Đối với tôi điều này chỉ làm việc lần đầu tiên (ví dụ, kiểm tra tất cả, bỏ chọn tất cả). Trên 'kiểm tra tất cả' thứ hai, không có hộp kiểm nào khác được chọn. Tôi đã sử dụng 'checkboxes.prop ('checked', true),' và 'checkboxes.prop ('checked', false);' thay vào đó, từ [this answer] (http://stackoverflow.com/a/15266603/1438809). Rất tiếc, chỉ cần nhận ra điều này được đề cập trong câu trả lời tiếp theo xuống trang ... – Felix

+3

[Tài liệu jQuery] (https://api.jquery.com/checkbox-selector/) nói rằng '$ (" [type = checkbox] ") 'nhanh hơn cho các trình duyệt hiện đại (nhanh hơn' $ (': checkbox') '). – Todd

13
$("form input[type='checkbox']").attr("checked" , true); 

hoặc bạn có thể sử dụng

:checkbox Selector

$("form input:checkbox").attr("checked" , true); 

Tôi đã viết lại HTML của bạn và cung cấp một handler nhấp chuột cho vào hộp kiểm chính

$(function(){ 
    $("#select_all").click(function() { 
     $("#frm1 input[type='checkbox'].child").attr("checked", $(this).attr("checked")); 
    }); 
}); 

<form id="frm1"> 
    <table> 
     <tr> 
      <td> 
       <input type="checkbox" id="select_all" /> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <input type="checkbox" name="select[]" class="child" /> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <input type="checkbox" name="select[]" class="child" /> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <input type="checkbox" name="select[]" class="child" /> 
      </td> 
     </tr> 
    </table> 
</form> 
+0

Chỉ cần cẩn thận để không kiểm tra mọi hộp kiểm trên trang ... :) –

+0

Thực ra, cú pháp chính xác là '.attr (" checked "," checked ")'. –

+0

+1 Cảm ơn rahul, nhưng tôi cần tìm tất cả các hộp kiểm khi người dùng nhấp vào hộp kiểm #select_all. – Darmen

0
$('.checkall').change(function() { 
    var checkboxes = $(this).closest('table').find('td').find(':checkbox'); 
    if($(this).is(':checked')) { 
     checkboxes.attr('checked', 'checked'); 
    } else { 
     checkboxes.removeAttr('checked'); 
    } 
}); 
41

đơn giản và sạch

$('#select_all').click(function() { 
    var c = this.checked; 
    $(':checkbox').prop('checked',c); 
}); 
+4

điều này cũng có thể được thực hiện như thế này ... '$ (': checkbox'). Prop ('checked', this.checked); ' –

+0

Tinh tế - đặt trạng thái đã chọn của các hộp kiểm đã truy xuất tương đương với hộp kiểm được sửa đổi gần đây của chúng tôi' hộp kiểm chính - đơn giản, thanh lịch và đáng ngạc nhiên hợp lý khi bạn nghĩ về nó - Cảm ơn! –

3
$(function() { 
$('#select_all').click(function() { 
    var checkboxes = $(this).closest('form').find(':checkbox'); 
    if($(this).is(':checked')) { 
     checkboxes.attr('checked', 'checked'); 
    } else { 
     checkboxes.removeAttr('checked'); 
    } 
}); 
    }); 
3
$(document).ready(function(){ 
    $("#select_all").click(function(){ 
     var checked_status = this.checked; 
     $("input[name='select[]']").each(function(){ 
     this.checked = checked_status; 
     }); 
    }); 
    }); 
29

câu trả lời trên sẽ không làm việc trong Jquery 1,9+ vì phương thức attr(). Sử dụng prop() thay vì:.

$(function() { 
    $('#select_all').change(function(){ 
     var checkboxes = $(this).closest('form').find(':checkbox'); 
     if($(this).prop('checked')) { 
      checkboxes.prop('checked', true); 
     } else { 
      checkboxes.prop('checked', false); 
     } 
    }); 
}); 
+0

Cảm ơn vì điều này, tôi đã sử dụng triển khai của bạn với JQuery 1.8.3 ;-) –

+1

OP thay đổi câu trả lời để đối phó với những thay đổi "gần đây" :) –

0
$("#select_all").live("click", function(){ 
      $("input").prop("checked", $(this).prop("checked")); 
    } 
    }); 
+2

Thêm một số giải thích/bình luận –

0

$ ("# select_all") thay đổi (function() {

$ ('input [type = "checkbox"]') chống đỡ (. "đã chọn", $ (this) .prop ("checked"));

});

0

Tôi hiện là một phần của phong cách này.

Tôi đã đặt tên cho biểu mẫu của bạn và thêm 'onClick' vào hộp select_all của bạn.

Tôi cũng đã loại trừ hộp kiểm 'select_all' khỏi bộ chọn jquery để giữ cho internet không phát sinh khi ai đó nhấp vào nó.

function toggleSelect(formname) { 
    // select the form with the name 'formname', 
    // then all the checkboxes named 'select[]' 
    // then 'click' them 
    $('form[name='+formname+'] :checkbox[name="select[]"]').click() 
} 

<form name="myform"> 
    <tr> 
     <td><input type="checkbox" id="select_all"  
        onClick="toggleSelect('myform')" /> 
     </td> 
    </tr> 
    <tr> 
     <td><input type="checkbox" name="select[]"/></td> 
    </tr> 
    <tr> 
     <td><input type="checkbox" name="select[]"/></td> 
    </tr> 
    <tr> 
     <td><input type="checkbox" name="select[]"/></td> 
    </tr> 
</table> 

0

Dưới đây là một plugin cơ bản jQuery Tôi đã viết rằng sẽ chọn tất cả các hộp kiểm tra trên trang web, ngoại trừ hộp kiểm/yếu tố đó được sử dụng như chuyển đổi:

(function($) { 
    // Checkbox toggle function for selecting all checkboxes on the page 
    $.fn.toggleCheckboxes = function() { 
     // Get all checkbox elements 
     checkboxes = $(':checkbox').not(this); 

     // Check if the checkboxes are checked/unchecked and if so uncheck/check them 
     if(this.is(':checked')) { 
      checkboxes.prop('checked', true); 
     } else { 
      checkboxes.prop('checked', false); 
     } 
    } 
}(jQuery)); 

Sau đó, chỉ cần gọi hàm trên hộp kiểm hoặc phần tử nút của bạn:

// Check all checkboxes 
$('.check-all').change(function() { 
    $(this).toggleCheckboxes(); 
}); 
3
jQuery(document).ready(function() { 
     jQuery('.select-all').on('change', function() { 
      if (jQuery(this).is(':checked')) { 
       jQuery('input.class-name').each(function() { 
        this.checked = true; 
       }); 
      } else { 
       jQuery('input.class-name').each(function() { 
        this.checked = false; 
       }); 
      } 
     }); 
    }); 
+0

Mã là rất tốt, nhưng một số giải thích lý do tại sao nó giúp luôn được chào đón. –

2

Mã này hoạt động tốt với tôi

<script type="text/javascript"> 
$(document).ready(function(){ 
$("#select_all").change(function(){ 
    $(".checkbox_class").prop("checked", $(this).prop("checked")); 
    }); 
}); 
</script> 

bạn chỉ cần thêm lớp checkbox_class cho tất cả các hộp kiểm

Dễ dàng và đơn giản: D

0

Đối mặt với vấn đề này , không có câu trả lời nào ở trên không hoạt động. Lý do là trong jQuery plugin Uniform (làm việc với theme metronic) .Tôi hy vọng câu trả lời sẽ có ích :)

Làm việc với jQuery Uniform

$('#select-all').change(function() { 
    var $this = $(this); 
    var $checkboxes = $this.closest('form') 
     .find(':checkbox'); 

    $checkboxes.prop('checked', $this.is(':checked')) 
     .not($this) 
     .change(); 
}); 
0

Một hộp kiểm để cai trị tất cả đều là

Đối với những người vẫn đang tìm kiếm cho plugin để kiểm soát hộp kiểm thông qua một hộp có trọng lượng nhẹ, có hỗ trợ out-of-the-box cho UniformJS và iCheck và không được chọn khi ít nhất một hộp kiểm được kiểm soát (và được kiểm tra khi tất cả các hộp kiểm được kiểm tra). đã tạo một jQuery checkAll plugin.

Hãy kiểm tra các ví dụ trên documentation page.


Ví dụ câu hỏi này tất cả các bạn cần làm là:

$('#select_all').checkall({ 
    target: 'input[type="checkbox"][name="select"]' 
}); 

Mà không phải là rõ ràng và đơn giản?

Các vấn đề liên quan