92 votes

jQuery, cases à cocher et .is (": vérifié")

Quand j'associe une fonction à une case de l'élément comme:

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

La case à cocher changements vérifier attribut avant le déclenchement de l'événement, c'est un comportement normal, et donc de donner et inverse de la suite.

Cependant, lorsque je fais:

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

La case à cocher changements vérifier attribut après le déclenchement de l'événement.

Ma question est, est-il un moyen pour déclencher l'événement click de jquery comme un normal cliquez sur le ferait (premier scénario)?

PS: j'ai déjà essayé avec l' trigger('click');

103voto

tcurdt Points 4916

Je pense que vous devriez plutôt utiliser le gestionnaire "change":

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

27voto

Nick Craver Points 313913

Il existe une solution de contournement qui fonctionne dans jQuery 1.3.2 et 1.4.2 :

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

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

Mais je suis d'accord, ce comportement semble buggé par rapport à l'événement natif.

4voto

srstanic Points 23

Je rencontre toujours ce problème avec jQuery 1.7.2. Une solution simple consiste à différer l'exécution du gestionnaire de clics avec setTimeout et à laisser le navigateur faire son tour dans l'intervalle:

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

2voto

ChillyPenguin Points 131

Si vous pensez que ce comportement indésirable, alors un loin autour, il serait de passer un paramètre supplémentaire à partir du jQuery.trigger() la case à cocher, cliquez sur gestionnaire. Ce paramètre supplémentaire est d'aviser le gestionnaire de clic clic a été déclenchée par programmation, plutôt que par l'utilisateur directement en cliquant sur la case elle-même. La case à cocher cliquez sur gestionnaire peut alors inverser l'rapporté vérifier l'état.

Voici donc comment j'allais déclencher l'événement de clic sur une case à cocher avec l'ID "myCheckBox". A noter que je suis aussi en passant un paramètre de l'objet avec un seul membre, nonUI, qui est à true:

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

Et voici comment je gère que, dans la case du gestionnaire d'événements click. La fonction de gestionnaire vérifie la présence de la nonUI objet comme second paramètre. (Le premier paramètre est toujours l'événement lui-même.) Si le paramètre est présent et mis à vrai, alors j'ai inverser le signalé .le statut vérifié. Si aucun paramètre n'est passé dans lequel il n'y aura pas si l'utilisateur clique simplement sur la case à cocher dans l'INTERFACE utilisateur - puis-je faire rapport du réel .le statut vérifié:

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

JSFiddle version à http://jsfiddle.net/BrownieBoy/h5mDZ/

J'ai testé avec Chrome, Firefox et IE 8.

0voto

RussellUresti Points 3469

Eh bien, pour faire correspondre le premier scénario, c'est quelque chose que j'ai mis au point.

http://jsbin.com/uwupa/edit

Au lieu de lier l’événement "click", vous liez l’événement "change" à l’alerte.

Ensuite, lorsque vous déclenchez l'événement, vous devez d'abord cliquer, puis déclencher le changement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X