JQuery changement boucle événement
-
09-10-2019 - |
Question
J'ai plusieurs cases à cocher. Si un utilisateur vérifie l'un d'eux, je dois voir s'ils sont autorisés à le faire, sinon, informez-les et décocher. Cependant, cela me obtenir dans une boucle car il déclenche le changement à nouveau! Comment puis-je venir cela?
$('#step_1, #step_2, #step_3, #step_4').change(function(event) {
if(!$('#section_2_active').attr('checked')){
alert('You can not select output options when "Create Output" has not been selected.');
$(this).attr('checked', false);
$('#other_stages :checkbox:not(#section_2_active, #co_t)').change();
}
});
Je ne peux pas unbind et rebind alors l'événement de changement comme il y a un autre plug-in qui est tributaire de cet événement.
Quelles autres options dois-je? Je peux joindre un appel de fonction à chaque case, mais je suis en espérant quelque chose d'un peu plus élégant, sinon, je vais avoir par défaut.
Merci à tous pour toute aide
La solution
Vous pouvez utiliser .trigger()
pour passer un paramètre supplémentaire à votre gestionnaire, nous utiliserons loop
. Si elle est false
, ne pas courir le déclencheur autre élément nouveau, comme ceci:
$('#step_1, #step_2, #step_3, #step_4').change(function(event, loop) {
if(!$('#section_2_active').attr('checked')){
alert('You can not select output options when "Create Output" has not been selected.');
$(this).attr('checked', false);
if(loop !== false)
$('#other_stages :checkbox:not(#section_2_active, #co_t)').trigger('change', false);
}
});
Autres conseils
est quelque chose comme simple changement ceci:
var inClickHandler = false;
function OnChecked(evt) {
if (inClickHandler) {
inClickHandler = false;
return;
}
inClickHandler = true;
// Do your stuff.
}
Pourquoi appelez-vous cette ligne? $('#other_stages :checkbox:not(#section_2_active, #co_t)').change();
Pour autant que je peux vous voir ne pas besoin de cela et il ne sera pas ensuite en boucle. La case à cocher vérifiera toujours sauf si vous utilisez event.preventDefault();
et la .attr('checked',false);
ne changera pas de déclenchement, probablement à cause des problèmes que vous rencontrez.