jQuery, pola wyboru i .is („: zaznaczone”)

88

Kiedy wiążę funkcję z elementem pola wyboru, takim jak:

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

Pole wyboru zmienia swój atrybut zaznaczony przed wyzwoleniem zdarzenia. Jest to normalne zachowanie i daje odwrotny wynik.

Jednak kiedy to robię:

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

Pole wyboru zmienia atrybut zaznaczenia po wyzwoleniu zdarzenia.

Moje pytanie brzmi: czy istnieje sposób na wywołanie zdarzenia kliknięcia z jQuery tak, jak zrobiłoby to normalne kliknięcie (pierwszy scenariusz)?

PS: już próbowałem trigger('click');

Ben
źródło
5
Właśnie to zweryfikowałem. Masz całkowitą rację. Że nie wydaje się, że może to być błąd. Podniosę
cletus
1
A co z wydarzeniem „zmiana”?
ZippyV
@cletus Rzeczywiście, jest to błąd Jquery 1.4.2. 1.3.2 działa dobrze.
Ben
Widzę to samo zachowanie zarówno w 1.4.2, jak i 1.3.2: jsfiddle.net/HCUNn
Nick Craver
@Nick Nadal działa odwrotnie niż normalne kliknięcie myszą. Szczerze mówiąc, nie wiem, dlaczego 1.3.2 działa u mnie, a 1.4.2 nie, ale mimo to należy to zmienić.
Ben

Odpowiedzi:

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

Uwaga: w starszych wersjach jquery można było go używać attr. Teraz sugeruje się użycieprop do odczytania stanu.

tcurdt
źródło
1
Próbowałem tego, „$ (# myCheckbox) .click ()” odznacza / zaznacza pole, ale funkcja zmiany nigdy nie jest wyzwalana. Próbowałem też zmienić atrybut „zaznaczone” zamiast wywoływać funkcję click (), a nawet ustawić funkcję „zmień” na „na żywo”.
Ben
@Ben - Musisz wyzwolić to w inny sposób, aby to zadziałało, zobacz moją odpowiedź na instrukcję wyzwalacza.
Nick Craver
@ Nick Dzięki, zaakceptuję odpowiedź tcurdt, ponieważ był pierwszym, który wyszedł z rozwiązaniem. Głupi ja, nie uruchomiłem metody „zmiany”.
Ben
19
a dla nowszych wersji jquery funkcją jest prop („zaznaczone”) zamiast attr („zaznaczone”) na wypadek, gdyby ktoś inny wyłapał.
danski
Unikałbym „prop” z powodu braku kompatybilności wstecznej, zwł. w IE.
vapcguy
27

Istnieje obejście, które działa w jQuery 1.3.2 i 1.4.2 :

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

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

Ale zgadzam się, to zachowanie wydaje się błędne w porównaniu z rodzimym wydarzeniem.

Nick Craver
źródło
10

Od czerwca 2016 r. (Przy użyciu jquery 2.1.4) żadne inne sugerowane rozwiązania nie działają. Sprawdzanie attr('checked')zawsze wraca undefinedi is('checked)zawsze wraca false.

Po prostu użyj metody prop:

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

  if ($(this).prop('checked')){
    console.log('checked');
  }
});
bezatomowy
źródło
2
is('checked)zwróci fałsz, ponieważ „zaznaczone” nie jest pseudo selektorem CSS. Powinien być poprawny, is(':checked')więc zamiast tego szuka „: zaznaczone”.
dhaupin
4

Nadal doświadczam tego zachowania z jQuery 1.7.2. Prostym obejściem jest odroczenie wykonania procedury obsługi kliknięcia za pomocą setTimeout i pozwolenie przeglądarce na wykonanie swojej magii w międzyczasie:

$("#myCheckbox").click( function() {
    var that = this;
    setTimeout(function(){
        alert($(that).is(":checked"));
    });
});
Srđan Stanić
źródło
Tak! Trochę offtopic, ale musiałem zrobić to samo w siatkach Kendo z polami wyboru, gdy ktoś kliknął „Dodaj nowy rekord”, jeśli chciałem, aby był domyślnie „Aktywny”. Musiałem też dać mu czas 500ms. Potem musiałem dodać .click(), a następnie ustawić .attr('value', 'true'), potem .change(), potem .blur(), zanim będzie programowo ustawić pole po kliknięciu przycisku „Update” programowo ....
vapcguy
2

Jeśli spodziewasz się tego raczej niepożądanego zachowania, jednym z rozwiązań byłoby przekazanie dodatkowego parametru z jQuery.trigger () do modułu obsługi kliknięcia pola wyboru. Ten dodatkowy parametr służy do powiadamiania modułu obsługi kliknięcia, że ​​kliknięcie zostało uruchomione programowo, a nie przez bezpośrednie kliknięcie pola wyboru przez użytkownika. Moduł obsługi kliknięcia pola wyboru może następnie odwrócić zgłoszony stan sprawdzenia.

Oto jak wywołać zdarzenie kliknięcia pola wyboru o identyfikatorze „myCheckBox”. Zauważ, że przekazuję również parametr obiektu z pojedynczym składnikiem, nonUI, który jest ustawiony na true:

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

A oto jak sobie z tym radzę w module obsługi zdarzeń kliknięcia pola wyboru. Funkcja obsługi sprawdza obecność obiektu nonUI jako drugiego parametru. (Pierwszym parametrem jest zawsze samo zdarzenie). Jeśli parametr jest obecny i ma wartość true, odwracam zgłoszony stan .checked. Jeśli nie zostanie przekazany żaden taki parametr - czego nie będzie, jeśli użytkownik po prostu kliknie pole wyboru w interfejsie użytkownika - zgłaszam rzeczywisty stan .checked:

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

Wersja JSFiddle na http://jsfiddle.net/BrownieBoy/h5mDZ/

Testowałem z Chrome, Firefox i IE 8.

ChillyPenguin
źródło
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");
}
});
Tejas Soni
źródło
Kilka komentarzy byłoby fajnych
Danil Gaponov
1
  $("#checkbox").change(function(e) {

  if ($(this).prop('checked')){
    console.log('checked');
  }
});
Nadczłowiek
źródło
1
$("#personal").click(function() {
      if ($(this).is(":checked")) {
            alert('Personal');
        /* var validator = $("#register_france").validate(); 
        validator.resetForm(); */
      }
            }
            );

JSFIDDLE

Surya R Praveen
źródło
0

Cóż, aby dopasować się do pierwszego scenariusza, to jest coś, co wymyśliłem.

http://jsbin.com/uwupa/edit

Zasadniczo zamiast wiązać zdarzenie „kliknięcie”, należy powiązać zdarzenie „zmiana” z alertem.

Następnie wyzwalając zdarzenie, najpierw uruchamiasz kliknięcie, a potem zmianę.

RussellUresti
źródło
0

Oprócz odpowiedzi Nicka Cravera, aby to działało poprawnie IE 8, musisz dodać dodatkowy moduł obsługi kliknięć do pola wyboru:

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

W przeciwnym razie wywołanie zwrotne zostanie uruchomione tylko wtedy, gdy pole wyboru straci fokus, ponieważ IE 8po ich kliknięciu pozostaje skupiony na polach wyboru i radiach.

IE 9Jednak nie testowałem .

Yuri Ghensev
źródło
0
$( "#checkbox" ).change(function() {
    if($(this).is(":checked")){
        alert('hi');
    }

});
user3607804
źródło
1
Proszę podać kilka szczegółów
CodeWarrior
Wygląda na to, że jest to tylko powtórzona odpowiedź, używając changezamiast OP click, i po prostu używa ifinstrukcji jako innego sposobu testowania :checked.
vapcguy
-1

Najszybszy i najłatwiejszy sposób :

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

$el[0].checked;

$ el - jest elementem selekcji jquery.

Cieszyć się!

Максим К.
źródło
-2
if ($.browser.msie) {
    $("#myCheckbox").click(function() { $(this).trigger('change'); });
}

$("#myCheckbox").change(function() {
        alert($(this).is(":checked"));
    });
user3239648
źródło