2013-02-08 54 views
31

Điều gì sẽ là một cách thích hợp để kiểm tra/bỏ chọn hộp kiểm được đặt bên trong phần tử kích hoạt chức năng của tôi?Kiểm tra hộp kiểm jQuery/bỏ chọn

Dưới đây là mã của tôi:

<table id="news_list"> 
<tr> 
    <td><input type="checkbox" name="news[1]" /></td> 
    <td>TEXT</td> 
</tr></table> 

$("#news_list tr").click(function() { 
    var ele = $(this).find('input'); 
    if(ele.is(':checked')){ 
     ele.removeAttr('checked'); 
     $(this).removeClass('admin_checked'); 
    }else{ 
     ele.attr('checked', 'checked'); 
     $(this).addClass('admin_checked'); 
    } 
}); 

Vấn đề là tôi có thể kiểm tra và bỏ chọn mỗi hộp chỉ một lần. Sau khi tôi đã kiểm tra và bỏ chọn đôi khi nó vẫn làm thêm/loại bỏ lớp, nhưng không bao giờ kiểm tra một hộp một lần nữa (ngay cả khi tôi bấm vào hộp kiểm, không phải hàng bảng).

Tôi đã thử sử dụng trình kích hoạt .bind ('click') nhưng kết quả tương tự.

Bất kỳ giải pháp nào?

+0

Nhìn vào câu trả lời, tôi không chắc họ đưa ra giải pháp cho những gì bạn đang cố gắng làm. Tôi không thấy lý do tại sao nó sẽ có ý nghĩa để vô hiệu hóa hộp kiểm, đó là những gì những câu trả lời đang làm (Bởi vì khi bạn bấm vào hộp kiểm nó sẽ trở thành kiểm tra và điều đó có nghĩa là nếu tuyên bố sẽ ngay lập tức bỏ chọn nó ... và điều đó có nghĩa là bạn có thể không bao giờ thực sự kiểm tra hộp kiểm bằng cách nhấp vào hộp kiểm thực tế ... phải không?). Đây có phải là điều bạn đang muốn làm không ?: http://jsfiddle.net/7gbhf/ – Joonas

+0

@Joonas Cảm ơn, đây chính xác là những gì tôi cần! Câu trả lời của Jai ​​đã làm việc cho hàng signle, không phải cho nhiều người – user1587985

+0

Tốt. Một điều mặc dù. Nếu jsfiddle của tôi là chính xác những gì bạn cần, tôi không chắc chắn tôi thấy câu trả lời của Jai ​​hoạt động như thế nào cho một hàng. Nó không cho phép bạn kiểm tra hộp kiểm bằng cách nhấp vào hộp kiểm, đó là do câu lệnh if như tôi đã giải thích ở trên. Vì vậy, tôi nghĩ rằng bạn đã bỏ lỡ phần đó, hoặc ... Tôi vẫn không biết những gì bạn muốn :) – Joonas

Trả lời

42

Sử dụng .prop() thay vào đó và nếu chúng ta đi với mã của bạn sau đó so sánh như thế này:

Nhìn vào ví dụ jsbin:

$("#news_list tr").click(function() { 
    var ele = $(this).find(':checkbox'); 
    if ($(':checked').length) { 
     ele.prop('checked', false); 
     $(this).removeClass('admin_checked'); 
    } else { 
     ele.prop('checked', true); 
     $(this).addClass('admin_checked'); 
    } 
}); 

Thay đổi:

  1. Đã thay đổi input thành :checkbox.
  2. So sánh the length của số checked checkboxes.
+0

'prop' không hoạt động đối với tôi, nhưng' removeAttr' và 'attr' đã làm, sử dụng jQuery 1.9.1. – machineaddict

+0

Xin cảm ơn, prop đã sắp xếp một vấn đề khác cho tôi, vì vậy tìm thấy thông tin này rất hữu ích. –

+0

@NickLewis bạn được chào đón. – Jai

19

Sử dụng giá trị prop() thay vì attr() để đặt giá trị checked. Cũng sử dụng :checkbox trong phương thức tìm kiếm thay vì input và cụ thể.

Live Demo

$("#news_list tr").click(function() { 
    var ele = $(this).find('input'); 
    if(ele.is(':checked')){ 
     ele.prop('checked', false); 
     $(this).removeClass('admin_checked'); 
    }else{ 
     ele.prop('checked', true); 
     $(this).addClass('admin_checked'); 
    } 
}); 

Use prop instead of attr for properties like checked

Tính đến jQuery 1.6, phương pháp .attr() trả về undefined cho các thuộc tính chưa được thiết lập. Để lấy và thay đổi thuộc tính DOM như các kiểm tra, lựa chọn, hay vô hiệu hóa trạng thái của các yếu tố hình thức, sử dụng .prop() phương pháp

+0

http://api.jquery.com/checkbox-selector/ Bởi vì: hộp kiểm là một phần mở rộng jQuery và không một phần của đặc tả CSS, truy vấn sử dụng: hộp kiểm không thể tận dụng lợi thế của tăng hiệu suất được cung cấp bởi phương thức DOM querySelectorAll() nguyên gốc. Để có hiệu suất tốt hơn trong trình duyệt hiện đại, hãy sử dụng [type = "checkbox"] để thay thế. –

+0

Hoạt động tốt) nhờ – rusllonrails

+1

Thực ra đây là giải pháp đúng. Câu trả lời được chấp nhận có một số vấn đề.Cảm ơn bạn đã giải pháp này. – Manik

5
$('mainCheckBox').click(function(){ 
    if($(this).prop('checked')){ 
     $('theControledCheckBoxes').prop('checked', true); 
    }else{ 
     $('theControledCheckBoxes').prop('checked', false); 
    } 
}); 
Các vấn đề liên quan