jQuery, hộp kiểm và .is (“: đã kiểm tra”)


88

Khi tôi liên kết một hàm với một phần tử hộp kiểm như:

$("#myCheckbox").click( function() {
    alert($(this).is(":checked"));
});

Hộp kiểm thay đổi thuộc tính đã kiểm tra của nó trước khi sự kiện được kích hoạt, đây là hành vi bình thường và cho kết quả ngược lại.

Tuy nhiên, khi tôi làm:

$("#myCheckbox").click();

Hộp kiểm thay đổi thuộc tính đã chọn sau khi sự kiện được kích hoạt.

Câu hỏi của tôi là, có cách nào để kích hoạt sự kiện nhấp chuột từ jQuery giống như một nhấp chuột bình thường sẽ làm (kịch bản đầu tiên) không?

Tái bút: Tôi đã thử với trigger('click');


5
Tôi vừa xác minh điều này. Bạn hoàn toàn chính xác. Điều đó có vẻ như nó có thể là một lỗi. Tôi muốn nêu ra nó như một lỗi với jQuery và xem điều gì sẽ xảy ra trên dev.jquery.com
cletus

1
Sự kiện 'thay đổi' thì sao?
ZippyV

@cletus Thật vậy, đó là một lỗi Jquery 1.4.2. 1.3.2 hoạt động tốt.
Ben

Tôi thấy cùng một hành vi trong cả 1.4.2 và 1.3.2: jsfiddle.net/HCUNn
Nick Craver

@Nick Nó vẫn làm ngược lại những gì một cú nhấp chuột bình thường sẽ làm. Tôi thành thật không biết tại sao 1.3.2 phù hợp với tôi và 1.4.2 thì không, nhưng vẫn còn, điều đó cần phải được thay đổi.
Ben

Câu trả lời:


97
$('#myCheckbox').change(function () {
    if ($(this).prop("checked")) {
        // checked
        return;
    }
    // not checked
});

Lưu ý: Trong các phiên bản jquery cũ hơn, bạn có thể sử dụng attr. Bây giờ nó được đề xuất sử dụngprop để đọc trạng thái.


1
Tôi đã thử điều đó, "$ (# myCheckbox) .click ()" bỏ chọn / chọn hộp nhưng hàm thay đổi không bao giờ được kích hoạt. Tôi cũng đã thử thay đổi thuộc tính 'đã kiểm tra' thay vì gọi click () và thậm chí đặt hàm 'thay đổi' thành 'sống'.
Ben

@Ben - Bạn phải kích hoạt nó theo một cách khác để chạy nó, hãy xem câu trả lời của tôi cho câu lệnh trigger.
Nick Craver

@Nick Cảm ơn, tôi sẽ chấp nhận câu trả lời của tcurdt vì anh ấy là người đầu tiên đưa ra giải pháp. Ngớ ngẩn tôi đã không kích hoạt phương pháp 'thay đổi'.
Ben

19
và đối với các phiên bản jquery mới hơn, hàm là prop ("đã kiểm tra") thay vì attr ("đã kiểm tra") trong trường hợp bắt được bất kỳ ai khác.
danski 13/09/13

Tôi sẽ tránh 'chống đỡ' do không tương thích ngược, đặc biệt. trong IE.
vapcguy

27

Có một công việc xung quanh hoạt động trong jQuery 1.3.21.4.2 :

$("#myCheckbox").change( function() {
    alert($(this).is(":checked"));
});

//Trigger by:
$("#myCheckbox").trigger('click').trigger('change');​​​​​​​​​​​​​

Nhưng tôi đồng ý, hành vi này có vẻ lỗi so với sự kiện gốc.


10

Kể từ tháng 6 năm 2016 (sử dụng jquery 2.1.4) không có giải pháp đề xuất nào khác hoạt động. Kiểm tra attr('checked')luôn trả lại undefinedis('checked)luôn trả lại false.

Chỉ cần sử dụng phương pháp chống đỡ:

$("#checkbox").change(function(e) {

  if ($(this).prop('checked')){
    console.log('checked');
  }
});

2
is('checked)sẽ trả về false vì "đã kiểm tra" không phải là bộ chọn giả CSS. Thay vào đó, câu trả lời đúng phải là is(':checked')": đã kiểm tra".
dhaupin

4

Tôi vẫn gặp phải hiện tượng này với jQuery 1.7.2. Một giải pháp đơn giản là trì hoãn việc thực thi trình xử lý nhấp chuột với setTimeout và để trình duyệt làm điều kỳ diệu của nó trong thời gian chờ đợi:

$("#myCheckbox").click( function() {
    var that = this;
    setTimeout(function(){
        alert($(that).is(":checked"));
    });
});

Vâng! Hơi dị ứng một chút, nhưng tôi phải làm như vậy trong lưới Kendo với các hộp kiểm khi ai đó nhấp vào "Thêm bản ghi mới" nếu tôi muốn nó ở chế độ "Hoạt động" theo mặc định. Tôi cũng phải cung cấp cho nó một thời gian là 500ms. Sau đó, tôi đã phải thêm .click(), sau đó thiết lập .attr('value', 'true'), sau đó .change(), sau đó .blur()trước khi nó sẽ theo chương trình thiết lập các hộp khi tôi nhấp vào nút "Cập nhật" lập trình ....
vapcguy

2

Nếu bạn đoán trước được hành vi khá không mong muốn này, thì một trong những cách khắc phục đó là chuyển một tham số bổ sung từ jQuery.trigger () đến trình xử lý nhấp chuột của hộp kiểm. Tham số bổ sung này là để thông báo cho trình xử lý nhấp chuột rằng nhấp chuột đã được kích hoạt theo chương trình, chứ không phải bởi người dùng nhấp trực tiếp vào chính hộp kiểm. Sau đó, trình xử lý nhấp chuột của hộp kiểm có thể đảo ngược trạng thái kiểm tra được báo cáo.

Vì vậy, đây là cách tôi kích hoạt sự kiện nhấp chuột trên hộp kiểm có ID "myCheckBox". Lưu ý rằng tôi cũng đang truyền một tham số đối tượng với một thành viên duy nhất, nonUI, được đặt thành true:

$("#myCheckbox").trigger('click', {nonUI : true})

Và đây là cách tôi xử lý điều đó trong trình xử lý sự kiện nhấp chuột của hộp kiểm. Hàm xử lý kiểm tra sự hiện diện của đối tượng nonUI dưới dạng tham số thứ hai của nó. (Tham số đầu tiên luôn là chính sự kiện.) Nếu tham số hiện diện và được đặt thành true thì tôi sẽ đảo ngược trạng thái .checked đã báo cáo. Nếu không có thông số nào như vậy được chuyển vào - sẽ không có nếu người dùng chỉ cần nhấp vào hộp kiểm trong giao diện người dùng - thì tôi báo cáo trạng thái .checked thực tế:

$("#myCheckbox").click(function(e, parameters) {
   var nonUI = false;
        try {
            nonUI = parameters.nonUI;
        } catch (e) {}
        var checked = nonUI ? !this.checked : this.checked;
        alert('Checked = ' + checked);
    });

Phiên bản JSFiddle tại http://jsfiddle.net/BrownieBoy/h5mDZ/

Tôi đã thử nghiệm với Chrome, Firefox và IE 8.


2
<input id="widget-wpb_widget-3-custom_date" class="mycheck" type="checkbox" value="d/M/y" name="widget-wpb_widget[3][custom_date]" unchecked="true">    

var atrib = $('.mycheck').attr("unchecked",true);
$('.mycheck').click(function(){
if ($(this).is(":checked")) 
{
$('.mycheck').attr("unchecked",false);
   alert("checkbox checked");
}
else
{
$('.mycheck').attr("unchecked",true);
 alert("checkbox unchecked");
}
});

Một số ý kiến sẽ được tốt đẹp
Danil Gaponov

1
  $("#checkbox").change(function(e) {

  if ($(this).prop('checked')){
    console.log('checked');
  }
});

1
$("#personal").click(function() {
      if ($(this).is(":checked")) {
            alert('Personal');
        /* var validator = $("#register_france").validate(); 
        validator.resetForm(); */
      }
            }
            );

JSFIDDLE


0

Để phù hợp với kịch bản đầu tiên, đây là điều mà tôi đã nghĩ ra.

http://jsbin.com/uwupa/edit

Về cơ bản, thay vì ràng buộc sự kiện "nhấp chuột", bạn ràng buộc sự kiện "thay đổi" với cảnh báo.

Sau đó, khi bạn kích hoạt sự kiện, trước tiên bạn kích hoạt nhấp chuột, sau đó kích hoạt thay đổi.


0

Ngoài câu trả lời của Nick Craver, để điều này hoạt động bình thường, IE 8bạn cần thêm một trình xử lý nhấp chuột bổ sung vào hộp kiểm:

// needed for IE 8 compatibility
if ($.browser.msie)
    $("#myCheckbox").click(function() { $(this).trigger('change'); });

$("#myCheckbox").change( function() {
    alert($(this).is(":checked"));
});

//Trigger by:
$("#myCheckbox").trigger('click').trigger('change');

Nếu không, lệnh gọi lại sẽ chỉ được kích hoạt khi hộp kiểm mất tiêu điểm, vì IE 8luôn tập trung vào hộp kiểm và radio khi chúng được nhấp vào.

Chưa thử nghiệm trên IE 9mặc dù.


0
$( "#checkbox" ).change(function() {
    if($(this).is(":checked")){
        alert('hi');
    }

});

1
Vui lòng đề cập đến một số chi tiết
CodeWarrior

Có vẻ như đây chỉ là một câu trả lời lặp lại, sử dụng changethay vì sử dụng OP clickvà chỉ sử dụng một ifcâu lệnh như một cách kiểm tra khác :checked.
vapcguy

-1

Cách nhanh nhất và dễ dàng nhất :

$('#myCheckbox').change(function(){
    alert(this.checked);
});

$el[0].checked;

$ el - là phần tử jquery của vùng chọn.

Thưởng thức!


-2
if ($.browser.msie) {
    $("#myCheckbox").click(function() { $(this).trigger('change'); });
}

$("#myCheckbox").change(function() {
        alert($(this).is(":checked"));
    });
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.