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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top