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


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.


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.


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

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

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.


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

Kilka komentarzy byłoby fajnych
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

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ę.


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 .


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

});

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ę!


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

$("#myCheckbox").change(function() {
        alert($(this).is(":checked"));
    });
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.