Domanda

Ho diverse caselle di controllo. Se un utente controlli nessuno di loro, devo vedere se sono autorizzati a farlo, se non, li informa e deselezionare esso. Tuttavia, questo mi entrare in un loop in quanto innesca di nuovo il cambiamento! Come posso venire su questo?

$('#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();
        }

});

Non posso unbind e quindi associare nuovamente l'evento di modifica in quanto v'è un altro plugin che fa affidamento su questo evento.

Quali altre opzioni ho? Posso allegare una chiamata di funzione per ciascuna casella di controllo, ma sto sperando in qualcosa di un po 'più elegante, se non, tale valore per default.

Grazie a tutti per tutto l'aiuto

È stato utile?

Soluzione

È possibile utilizzare .trigger() di passare un parametro aggiuntivo al vostro gestore, useremo loop. Se si tratta di false, non eseguire di nuovo il grilletto altro elemento, in questo modo:

$('#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);
  }
});

Altri suggerimenti

Il cambiamento più semplice è qualcosa di simile:

var inClickHandler = false;

function OnChecked(evt) { 
  if (inClickHandler) {
    inClickHandler = false;
    return;
  }
  inClickHandler = true;

  // Do your stuff.
}

Perché si chiama questa linea? $('#other_stages :checkbox:not(#section_2_active, #co_t)').change(); Per quanto posso vedere non è necessario questo e non sarà quindi ciclo. La casella di controllo sarà ancora verificare se non si utilizza event.preventDefault(); e il .attr('checked',false); non cambierà grilletto, probabilmente a causa dei problemi che stai avendo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top