jQuery, onay kutuları ve .is (": işaretlendi")


91

Bir işlevi aşağıdaki gibi bir onay kutusu öğesine bağladığımda:

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

Onay kutusu , olay tetiklenmeden önce işaretli niteliğini değiştirir , bu normal davranıştır ve ters bir sonuç verir.

Ancak, yaptığımda:

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

Onay kutusu , olay tetiklendikten sonra kontrol ettiği niteliği değiştirir .

Sorum şu, jQuery'den tıklama olayını normal bir tıklamanın yapacağı gibi tetiklemenin bir yolu var mı (ilk senaryo)?

Not: Ben zaten denedim trigger('click');


5
Bunu şimdi doğruladım. Tamamen haklısın Bu bir hata gibi görünüyor . Bunu jQuery ile bir hata olarak yükseltirdim ve ne olacağını görüyorum dev.jquery.com
cletus

1
Ya 'değişim' olayı?
ZippyV

@cletus Aslında, bir Jquery 1.4.2 hatasıdır. 1.3.2 gayet iyi çalışıyor.
Ben

Hem 1.4.2 hem de 1.3.2'de aynı davranışı görüyorum: jsfiddle.net/HCUNn
Nick Craver

@Nick Hala normal bir fare tıklamasının yapacağının tersini yapıyor. Dürüst olmak gerekirse, 1.3.2'nin neden benim için işe yaradığını ve 1.4.2'nin neden işe yaramadığını bilmiyorum, ama yine de değiştirilmesi gerekiyor.
Ben

Yanıtlar:


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

Not: jquery'nin eski sürümlerinde kullanımda sorun yoktu attr. Şimdiprop durumu okumak için kullanılması önerilir .


1
Bunu denedim, "$ (# myCheckbox) .click ()" kutunun işaretini kaldırıyor / işaretliyor ancak değişiklik işlevi hiçbir zaman tetiklenmiyor. Ayrıca click () 'i çağırmak yerine' işaretli 'özelliğini değiştirmeyi ve hatta' değiştir 'işlevini' canlı 'olarak ayarlamayı denedim.
Ben

@Ben - Bunu çalıştırmak için farklı bir şekilde tetiklemelisiniz, tetikleme ifadesi için cevabımı görün.
Nick Craver

@Nick Teşekkürler, çözüm ile ilk çıkan tcurdt cevabını kabul edeceğim. Aptalca ben 'değiştirme' yöntemini tetiklemedim.
Ben

19
ve jquery'nin daha yeni sürümleri için, başka birini yakalaması durumunda işlev attr ("işaretli") yerine prop ("işaretli") olur.
danski

Geriye dönük olmayan uyumluluk nedeniyle 'pervane'den kaçınırdım, özellikle. IE'de.
vapcguy

27

JQuery 1.3.2 ve 1.4.2'de çalışan bir çözüm var :

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

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

Ama katılıyorum, bu davranış yerel olaya kıyasla hatalı görünüyor.


10

Haziran 2016 itibarıyla (jquery 2.1.4 kullanılarak) önerilen diğer çözümlerin hiçbiri çalışmamaktadır. Kontrol attr('checked')her zaman geri döner undefinedve is('checked)her zaman geri döner false.

Sadece prop yöntemini kullanın:

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

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

2
is('checked)"işaretli" bir CSS sözde seçicisi olmadığından yanlış döndürür. Doğru olan, is(':checked')bunun yerine ": işaretlendi" olarak görünecek şekilde olmalıdır .
dhaupin

4

Hala jQuery 1.7.2 ile bu davranışı yaşıyorum. Basit bir çözüm, tıklama işleyicisinin çalıştırılmasını setTimeout ile ertelemek ve bu arada tarayıcının sihrini yapmasına izin vermektir:

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

Evet! Biraz konu dışı, ancak aynı şeyi kendo ızgaralarında, birisi varsayılan olarak "Aktif" olmasını istiyorsam "Yeni kayıt ekle" yi tıkladığında onay kutularıyla yapmak zorunda kaldım. Ayrıca ona 500 ms'lik bir süre vermem gerekiyordu. Sonra eklemek zorunda .click(), o zaman set .attr('value', 'true'), o zaman .change(), o zaman .blur().... ben programlı "Güncelle" düğmesine tıklandığında programlı kutusunu kuracak önce
vapcguy

2

Bu oldukça istenmeyen davranışı öngörürseniz, jQuery.trigger () 'den onay kutusunun tıklama işleyicisine fazladan bir parametre geçirebilirsiniz. Bu ekstra parametre, tıklama işleyicisine tıklamanın kullanıcı tarafından doğrudan onay kutusunu tıklaması yerine programla tetiklendiğini bildirmektir. Onay kutusunun tıklama işleyicisi, rapor edilen kontrol durumunu tersine çevirebilir.

İşte "myCheckBox" kimliğine sahip bir onay kutusundaki tıklama olayını nasıl tetikleyeceğim. Ayrıca, true olarak ayarlanmış tek bir üye nonUI ile bir nesne parametresi geçirdiğimi unutmayın:

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

Ve onay kutusunun tıklama olayı işleyicisinde bunu şu şekilde ele alıyorum. İşleyici işlevi, ikinci parametresi olarak nonUI nesnesinin varlığını kontrol eder. (İlk parametre her zaman olayın kendisidir.) Parametre mevcutsa ve true olarak ayarlanmışsa, rapor edilen .checked durumunu tersine çeviririm. Böyle bir parametre aktarılmazsa (kullanıcı, kullanıcı arayüzündeki onay kutusunu tıklarsa bu olmaz), gerçek .checked durumunu bildiririm:

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

En JSFiddle versiyonu http://jsfiddle.net/BrownieBoy/h5mDZ/

Chrome, Firefox ve IE 8 ile test ettim.


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");
}
});

Bazı yorumlar güzel olurdu
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

İlk senaryoya uygun olarak, bu benim bulduğum bir şey.

http://jsbin.com/uwupa/edit

Esasen, "tıklama" olayını bağlamak yerine, "değiştir" olayını uyarıyla bağlarsınız.

Ardından, etkinliği tetiklediğinizde önce tıklamayı, ardından değişikliği tetiklersiniz.


0

Nick Craver'ın cevabına ek olarak, bunun üzerinde düzgün bir şekilde çalışması IE 8için onay kutusuna ek bir tıklama işleyici eklemeniz gerekir:

// 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');

Aksi takdirde, geri arama IE 8, tıklandıklarında onay kutularına ve radyolara odaklanmayı sürdürdüğünden, yalnızca onay kutusu odağı kaybettiğinde tetiklenir .

IE 9Yine de test etmedim.


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

});

1
Lütfen bazı ayrıntılardan bahsedin
CodeWarrior

Görünüşe göre bu sadece changeOP'ler yerine tekrarlanan bir cevap clickve iftest etmenin farklı bir yolu olarak bir ifade kullanıyor :checked.
vapcguy

-1

En hızlı ve kolay yol :

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

$el[0].checked;

$ el - seçimin jquery öğesidir.

Zevk almak!


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

$("#myCheckbox").change(function() {
        alert($(this).is(":checked"));
    });
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.