J'utilise l'événement bascule de Jquery pour faire des choses lorsqu'un utilisateur clique sur une case à cocher, comme ceci:
$('input#myId').toggle(
function(){
//do stuff
},
function(){
//do other stuff
}
);
Le problème est que la case n'est pas cochée lorsque je clique dessus. (Tout ce que j'ai mis dans l'événement bascule fonctionne correctement.)
J'ai essayé ce qui suit:
$('input#myId').attr('checked', 'checked');
et
$(this).attr('checked', 'checked');
et même simplement
return true;
Mais rien ne fonctionne. Quelqu'un peut-il me dire où je me trompe?
Modifier - merci à tous ceux qui ont répondu. La réponse de Dreas a très bien fonctionné pour moi, à l'exception de la partie qui a vérifié l'attribut. Cela fonctionne parfaitement (même si c'est un peu hacky)
$('input#myInput').change(function ()
{
if(!$(this).hasClass("checked"))
{
//do stuff if the checkbox isn't checked
$(this).addClass("checked");
return;
}
//do stuff if the checkbox isn't checked
$(this).removeClass('checked');
});
Merci encore à tous ceux qui ont répondu.
Utilisez l'événement change
au lieu de l'événement toggle
, comme par exemple:
$('input#myId').change(function () {
if ($(this).attr("checked")) {
//do the stuff that you would do when 'checked'
return;
}
//Here do the stuff you want to do when 'unchecked'
});
Bien que l'utilisation du gestionnaire d'événements change
suggéré par Dreas Grech soit appropriée, cela ne fonctionne pas bien dans IE 6 & 7, qui ne déclenche pas le change
jusqu'à ce que le focus soit flou (c'est-à-dire jusqu'à ce que vous cliquiez en dehors de la zone de la case à cocher). Comme QuirksMode dites, "c'est un bug sérieux".
Vous souhaiterez peut-être utiliser le gestionnaire d'événements click
, mais cela ne fonctionnera pas avec la navigation au clavier. Vous devez également enregistrer un gestionnaire keyup
...
Voir aussi cette question connexe .
Je n'ai pas encore trouvé une bonne solution multi-navigateur qui prend en charge les clics de souris et l'activation du clavier des cases à cocher (et ne déclenche pas trop d'événements).
Concernant votre solution pour vérifier si la case est cochée ou non, au lieu d'ajouter votre propre classe checked
, vous pouvez utiliser l'attribut HTML checked
:
$('input#myInput').change(function () {
if ($(this).attr("checked")) {
//do stuff if the checkbox is checked
} else {
//do stuff if the checkbox isn't checked
}
});
Tout navigateur définit l'attribut checked
d'un élément input
sur la valeur "checked"
si la case est cochée et la définit sur null
(ou supprime l'attribut) si la case n'est pas cochée.
pourquoi ne pas utiliser $ .is ()?
$('input#myId').change(
function() {
if ($(this).is(':checked')) {
// do stuff here
} else {
// do other stuff here
}
});
Ceci est une réponse de MorningZ (je l'ai trouvée ici ) qui est totalement logique:
La partie qui vous manque est que "case à cocher" est un objet jQuery, pas un objet DOM de case à cocher
donc:
checkbox.checked
Commettrait une erreur car il n'y a pas de propriété .checked
D'un objet jQuery
donc:
checkbox[0].checked
Fonctionnerait puisque le premier élément d'un tableau jQuery est l'objet DOM lui-même.
Ainsi, dans votre fonction change()
, vous pouvez utiliser
$(this)[0].checked
$('input#myId').toggle(
function(e){
e.preventDefault();
//do stuff
$(this).attr('checked', 'true');
},
function(e){
e.preventDefault();
//do other stuff
$(this).attr('checked', 'false');
}
);
cela a fonctionné pour moi ............ vérifiez-le
$(":checkbox").click(function(){
if($(this).attr("id").split("chk_all")[1])
{
var ty = "sel"+$(this).attr("id").split("chk_all")[1]+"[]";
if($(this).attr("checked"))
{
$('input[name="'+ty+'"]').attr("checked", "checked");
}
else
{
$('input[name="'+ty+'"]').removeAttr("checked");
}
}
})
Essayer:
$(":checkbox").click(function(){
if($(this).attr("checked"))
{
$('input[name="name[]"]').attr("checked", "checked");
}
else
{
$('input[name="name[]"]').removeAttr("checked");
}
})
$("input[type=checkbox][checked=false]")// be shure to set to false on ready
$("input#Checkbox1").change(function() {
if ($(this).attr("checked")) {
$("#chk1").html("you just selected me")//the lable
} else {$("#chk1").html("you just un selected me") }
});
Essayez d'utiliser une fonction non jquery:
function chkboxToggle() {
if ($('input#chkbox').attr('checked'))
// do something
else
// do something else
}
puis sous votre forme:
<input id="chkbox" type="checkbox" onclick="chkboxToggle()" />
J'ai fait une approche similaire mais en utilisant simplement l'attribut vérifié tel que
//toggles checkbox on/off
$("input:checkbox").change(
function(){
if(!this.checked){
this.checked=true;
}
else{
this.checked=false;
}
}
);
//end toggle