.prop ('đã kiểm tra', sai) hoặc .removeAttr ('đã kiểm tra')?


115

Với sự ra đời của phương thức prop, bây giờ tôi cần biết cách bỏ chọn hộp kiểm được chấp nhận. Là nó:

$('input').filter(':checkbox').removeAttr('checked');

hoặc là

$('input').filter(':checkbox').prop('checked',false);

4
Bạn đã đọc bài của John Resig chưa? ejohn.org/blog/jquery-16-and-attr
Jared Farrish

Câu trả lời:


130

jQuery 3

Tính đến jQuery 3, removeAttrkhông không thiết lập thuộc tính tương ứng với falsenữa:

Trước jQuery 3.0, sử dụng .removeAttr()trên một thuộc tính boolean như checked, selectedhoặc readonlycũng có thể thiết lập tương ứng với tên tài sản cho false. Hành vi này là bắt buộc đối với các phiên bản cũ của Internet Explorer nhưng không đúng đối với các trình duyệt hiện đại vì thuộc tính đại diện cho giá trị ban đầu và thuộc tính đại diện cho giá trị hiện tại (động).

Hầu như luôn luôn là một sai lầm khi sử dụng .removeAttr( "checked" )trên phần tử DOM. Lần duy nhất nó có thể hữu ích là nếu sau này DOM sẽ được tuần tự hóa trở lại chuỗi HTML. Trong tất cả các trường hợp khác, .prop( "checked", false )nên được sử dụng thay thế.

Changelog

Do đó chỉ .prop('checked',false)là cách đúng khi sử dụng phiên bản này.


Câu trả lời gốc (từ năm 2011):

Đối với các thuộc tính có thuộc tính boolean cơ bản (trong đó checkedlà một), hãy removeAttrtự động đặt thuộc tính cơ bản thành false. (Lưu ý rằng đây là một trong số các "bản sửa lỗi" tương thích ngược được thêm vào jQuery 1.6.1).

Vì vậy, một trong hai sẽ hoạt động ... nhưng ví dụ thứ hai bạn đưa ra (sử dụng prop) là chính xác hơn trong hai. Nếu mục tiêu của bạn là bỏ chọn hộp kiểm, bạn thực sự muốn ảnh hưởng đến thuộc tính chứ không phải thuộc tính và không cần phải removeAttrthực hiện điều đó.


36
@tandu: Bạn có thể , nhưng bạn không nên. Từ tài liệu: " Lưu ý: Không sử dụng [ removeProp()] để xóa các thuộc tính gốc như đã chọn, đã tắt hoặc đã chọn. Thao tác này sẽ xóa hoàn toàn thuộc tính và sau khi xóa, không thể thêm lại vào phần tử. Sử dụng .prop()để đặt các thuộc tính này thành false thay thế." removePropthực sự chỉ nhằm mục đích sử dụng với các thuộc tính tùy chỉnh.
John Flatness

17

sử dụng checked: thuộc tính true, false của hộp kiểm.

jQuery:

if($('input[type=checkbox]').is(':checked')) {
    $(this).prop('checked',true);
} else {
    $(this).prop('checked',false);
}

Chúng ta có thể loại bỏ if, else bằng cách sử dụng một lớp lót, $ (this) .prop ('check', $ ('input [type = checkbox]'). Is (': check'));
Yousaf Hassan

8

Tôi khuyên bạn nên sử dụng cả hai, prop và attr vì tôi gặp sự cố với Chrome và tôi đã giải quyết nó bằng cả hai chức năng.

if ($(':checkbox').is(':checked')){
    $(':checkbox').prop('checked', true).attr('checked', 'checked');
}
else {
    $(':checkbox').prop('checked', false).removeAttr('checked');
}

Vâng, cho chrome, sử dụng: $("input[type='checkbox'], input[type='radio']").prop("checked", false).attr("checked", false).removeAttr("checked");
Rod

Tôi sử dụng thành phần tùy chỉnh (CSS + JS) để thay thế hộp kiểm và radio đầu vào. Đây là cách duy nhất phù hợp với tôi. Cảm ơn!
Silvio Delgado

3

Một cách khác để làm điều tương tự là lọc theo thuộc tính type = checkbox :

$('input[type="checkbox"]').removeAttr('checked');

hoặc là

$('input[type="checkbox"]').prop('checked' , false);

Hãy nhớ rằng Sự khác biệt giữa thuộc tính và thuộc tính có thể quan trọng trong các tình huống cụ thể. Trước jQuery 1.6 , phương thức .attr () đôi khi đã tính đến các giá trị thuộc tính khi truy xuất một số thuộc tính, điều này có thể gây ra hành vi không nhất quán. Kể từ jQuery 1.6, phương thức .prop () cung cấp một cách để truy xuất các giá trị thuộc tính một cách rõ ràng, trong khi .attr () truy xuất các thuộc tính.

Biết thêm ...


2
Câu hỏi là "Cách nào trong số này đúng hơn", chứ không phải "Có cách nào khác để làm điều này không?". Bạn không dường như đã cố gắng trả lời câu hỏi
Andrew Stubbs
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.