2009-09-23 7 views
70

J'ai utilisé une fonction de survol où vous faites x au survol de la souris et y et le mouseout. J'essaie la même chose pour un clic, mais il ne semble pas fonctionner:Cliquez pour basculer avec jQuery

$('.offer').click(function(){ 
    $(this).find(':checkbox').attr('checked', true); 
},function(){ 
    $(this).find(':checkbox').attr('checked', false); 
}); 

Je veux la case à vérifier en cliquant sur un div et sans contrôle si vous cliquez à nouveau - une bascule de clic.

+0

Voici tutoriel sur [Comment créer le plugin JQuery pour convertir les boutons radio en boutons à bascule] (http://sgeek.org/jquery-toggle-button-plugin-for-sliding-toggle-switches-sswitch /) et [Ici vous pouvez voir la démo] (http://www.demos.sgeek.org/sswitch-jquery-plugin-demo/). Espérons qu'il peut vous aider ou d'autres utilisateurs –

Répondre

213

Cela se fait facilement en renversant l'état actuel « checked » de la case à cocher sur chaque clic. Exemples:

$(".offer").on("click", function() { 
     var $checkbox = $(this).find(':checkbox'); 
     $checkbox.attr('checked', !$checkbox.attr('checked')); 
}); 

ou:

$(".offer").on("click", function() { 
     var $checkbox = $(this).find(':checkbox'); 
     $checkbox.attr('checked', !$checkbox.is(':checked')); 
}); 

ou, en manipulant directement les DOM 'checked' propriété (par exemple ne pas utiliser attr()-d'extraction l'état actuel de la case à cocher cliqué):

$(".offer").on("click", function() { 
     var $checkbox = $(this).find(':checkbox'); 
     $checkbox.attr('checked', !$checkbox[0].checked); 
}); 

... et ainsi de suite.

Note: depuis jQuery 1.6, des cases à cocher doit être définie à l'aide prop pas attr:

$(".offer").on("click", function() { 
     var $checkbox = $(this).find(':checkbox'); 
     $checkbox.prop('checked', !$checkbox[0].checked); 
}); 
+0

Ooh, votre chemin est meilleur, upvoted. – lod3n

+0

Parfait, merci tas! – 3zzy

+0

Je ne recommanderais pas de définir l'attribut DOM d'un élément à une valeur booléenne. Vraisemblablement, il est converti en chaîne ''1'' dans le processus. –

0

essayer de le changer:

$(this).find(':checkbox').attr('checked', true); 

à ceci:

$(this).find(':checkbox').attr('checked', 'checked'); 

pas 100% sûr si cela le faire, mais je crois me souvenir avoir un problème similaire. Bonne chance!

0
$('.offer').click(function(){ 
    if ($(this).find(':checkbox').is(':checked')) 
    { 
     $(this).find(':checkbox').attr('checked', false); 
    }else{ 
     $(this).find(':checkbox').attr('checked', true); 
    } 
}); 
7

Vous pouvez utiliser la fonction toggle:

$('.offer').toggle(function() { 
    $(this).find(':checkbox').attr('checked', true); 
}, function() { 
    $(this).find(':checkbox').attr('checked', false); 
}); 
+0

Cela a été abandonné. –

0
$('.offer').click(function() { 
    $(':checkbox', this).each(function() { 
     this.checked = !this.checked; 
    }); 
}); 
2

Pourquoi ne pas en une ligne?

$('.offer').click(function(){ 
    $(this).find(':checkbox').attr('checked', !$(this).find(':checkbox').attr('checked')); 
}); 
27

Une autre approche serait de jquery étendu comme celui-ci:

$.fn.toggleCheckbox = function() { 
    this.attr('checked', !this.attr('checked')); 
} 

appeler ensuite:

$('.offer').find(':checkbox').toggleCheckbox(); 
+2

J'aime ça, car cela fonctionne aussi pour les trains de cases à cocher. +1 – Tino

+0

Vous devez ajouter 'this.trigger ('change');' sinon, l'événement onChange ne sera pas déclenché. –

11

Attention: l'utilisation attr() ou prop() pour changer l'état d'une case ne feu le ch ange event dans la plupart des navigateurs avec lesquels j'ai testé. L'état vérifié changera mais aucun événement ne bouillonnera. Vous devez déclencher l'événement de modification manuellement après avoir défini l'attribut checked. J'avais d'autres gestionnaires d'événements surveillant l'état des cases à cocher et ils fonctionneraient très bien avec les clics directs de l'utilisateur. Toutefois, la définition de l'état checked par programmation ne déclenche pas systématiquement l'événement change.

jQuery 1,6

$('.offer').bind('click', function(){ 
    var $checkbox = $(this).find(':checkbox'); 
    $checkbox[0].checked = !$checkbox[0].checked; 
    $checkbox.trigger('change'); //<- Works in IE6 - IE9, Chrome, Firefox 
}); 
+1

vous pouvez également déclencher directement l'événement click. – davenpcj

1

J'ai une seule case à cocher nommée chkDueDate et un objet HTML avec un événement click comme suit:

$('#chkDueDate').attr('checked', !$('#chkDueDate').is(':checked')); 

En cliquant sur l'objet HTML (dans ce cas, un <span>) permet de basculer la propriété checked de la case à cocher.

0
<label> 
    <input 
     type="checkbox" 
     onclick="$('input[type=checkbox]').attr('checked', $(this).is(':checked'));" 
    /> 
    Check all 
</label> 
0

solution la plus simple

$('.offer').click(function(){ 
    var cc = $(this).attr('checked') == undefined ? false : true; 
    $(this).find(':checkbox').attr('checked',cc); 
}); 
+0

Fermez. Il sera 'indéfini' au premier clic, en assignant la valeur 'faux'. Ensuite, il sera défini lors du second clic, en assignant la valeur 'vrai'. Lors d'un troisième clic, il sera toujours défini, donc il sera toujours assigné "vrai". –

0

Une autre solution alternative à basculer la valeur de case à cocher:

<div id="parent"> 
    <img src="" class="avatar" /> 
    <input type="checkbox" name="" /> 
</div> 


$("img.avatar").click(function(){ 

    var op = !$(this).parent().find(':checkbox').attr('checked'); 
    $(this).parent().find(':checkbox').attr('checked', op); 

}); 
0
$('controlCheckBox').click(function(){ 
    var temp = $(this).prop('checked'); 
    $('controlledCheckBoxes').prop('checked', temp); 
}); 
1

jQuery: meilleure façon, déléguer les actions à jQuery (jQuery = jQuery).

$("input[type='checkbox']").prop("checked", function(i, val) { 
    return !val; 
}); 
Questions connexes