2010-09-21 11 views
46

Ho un set di pulsanti di opzione, tutti in stile .button() dell'interfaccia utente di jQuery.Pulsante di scelta dell'interfaccia utente jQuery - come passare correttamente allo stato di controllo

Desidero modificare lo stato selezionato. Tuttavia, quando lo faccio programatically sul evento di modifica del contenitore con:

$("#myradio [value=1]").attr("checked", false); 
$("#myradio [value=2]").attr("checked", true); 

I valori vengono modificati in modo corretto, ma lo stile di interfaccia utente mostra ancora il pulsante di opzione non controllato con lo stile controllato, e quello controllato sembra ancora incontrollato.

Ho esaminato la documentazione dell'interfaccia utente jQuery sul metodo button() per i pulsanti di opzione, ma non c'è nulla su come modificare lo stato e aggiornare lo stile dell'interfaccia utente.

In poche parole, il problema è che la chiamata al codice $("selector").button("disable"); non modifica lo stato attivo del pulsante: il pulsante di opzione sottostante viene controllato correttamente, ma lo stato attivo dell'interfaccia utente non cambia. Quindi, ottengo un pulsante in grigio che sembra sia ancora controllato, e il pulsante reale selezionato appare deselezionato.

Soluzione

$("selector").button("enable").button("refresh"); 
+0

Antonio, ho provato e il pulsante ("abilitare") non funziona per me. Non dovrebbe essere come * $ ("selettore"). Attr ('checked', true) .button ("refresh"); *? –

risposta

55

è necessario chiamare il metodo refresh dopo aver cambiato lo stato di fondo:

Refreshes the visual state of the button. Useful for updating button state after the native element's checked or disabled state is changed programatically.

esempio di lavoro: http://jsbin.com/udowo3

function setRadio(id) { 
    var radio = $('#' + id); 
    radio[0].checked = true; 
    radio.button("refresh"); 
} 

che utilizza gli ID per le radio, ma non importa finché si ottiene un'istanza jQuery contenente l'elemento input[type=radio] pertinente.

+0

Worked - thank you! Perché devo fare questo? Si tratta di un bug o di un comportamento errato nell'interfaccia utente di jQuery? –

+0

@Antony: Beh, non c'è nessun evento affidabile, cross-browser generato quando lo stato delle proprietà 'checked' o' disabled' è cambiato. Quello che mi sorprende è che non stanno usando i CSS per fare in modo che il browser gestisca automaticamente la modifica, ma mi aspetto che abbiano una ragione (supporto IE6, forse - IE6 non fa selettori di stato su qualsiasi cosa che non sia link). L'altra sorpresa è stata che non forniscono un metodo che è possibile utilizzare per modificare lo stato 'checked' e aggiornare l'interfaccia utente tutto in una volta. Ancora, abbastanza facile una volta che lo sai. :-) –

+0

Precisamente! grazie T.J. –

1

Guardando il code, è necessario attivare la classe ui-state-active, ma il modo più semplice è probabilmente solo $('someradiobutton').trigger('click') (o se non si desidera che i gestori di eventi personalizzati per l'esecuzione, $('someradiobutton').trigger('click.button')).

+0

Modifica lo stato del pulsante radio sottostante, ma non ancora lo stile dell'interfaccia utente ... –

+0

-1: Questo non funzionerà con 'jQuery UI button's (di cui tratta la domanda) poiché creano elementi separati non collegati alla radio originale pulsante. Devi chiamare il pulsante '(" aggiorna ")' dopo aver cambiato lo stato del pulsante (preferibilmente con 'prop ('checked', boolvalue)') –

16

Nonostante i messaggi contrari, è possibile fare riferimento a un pulsante di opzione tramite ID. Non certo perché JQuery UI non aggiorna i pulsanti automaticamente quando controllato, ma si fa in questo modo:

$('selector').attr('checked','checked').button("refresh"); 

esempio di lavoro:

<div id = "buttons"> 
<label for="b1">button1</label> 
<label for="b2">button2</label> 
<label for="b3">button3</label> 

<input type="radio" name = "groupa" id = "b1" value="b1"> 
<input type="radio" name = "groupa" id = "b2" value="b2"> 
<input type="radio" name = "groupa" id = "b3" value="b3"> 
</div> 

<script> 
    $('#buttons input').button();  
    $('#b3').prop('checked', true).button("refresh"); 
</script> 
+5

La mia unica aggiunta qui sarebbe di usare 'prop' invece di 'attr' e quindi renderlo $ ('selector'). prop ("controllato", true) apri un ("refresh"). – MickJ

+0

Quando provo questa correzione, ottengo il seguente errore - Errore non rilevato: impossibile chiamare i metodi sul pulsante prima dell'inizializzazione; tentativo di chiamare il metodo 'Aggiorna' Qualcuno sa cosa potrebbe causare questo? – Blake

1

resetterà tutti i pulsanti di opzione, ma si può ottenere più specifiche con il selettore.

$('input:radio') 
    .removeAttr('checked') 
    .removeAttr('selected') 
    .button("refresh"); 
+2

-1: Questo non funzionerà con 'jQuery UI button's (di cui tratta la domanda) poiché creano elementi separati non collegati al pulsante di opzione originale. Devi chiamare il pulsante '(" aggiorna ")' dopo aver cambiato lo stato del pulsante (preferibilmente con 'prop ('checked', boolvalue)') –

0

Ho risolto ripristinando completamente il pulsante con setTimeout.

Aggiungi un evento clic al pulsante di opzione che richiede conferma.
Si prega di notare il cliccato 'radioButton' e la completa 'radioSet' nel seguente codice:

$('#radioButton').click(function(){ 
    if(confirm('Confirm Text') != true){ 
     resetButtonset('#radioSet', 200); 
     return false; 
    }; 
}); 

Creare una comoda funzione che ripristina la tua Buttonset:

function resetButtonset(name, time){ 
    setTimeout(function(){$(name).buttonset();}, time); 
} 
-1
$('input:radio[name="radioname"] + label[for="eglabel"]').click(); 

Questo è tutto.

+1

-1: Questo non funzionerà con 'jQuery UI button's (che la domanda è su) in quanto creano elementi separati non collegati al pulsante di opzione originale. Devi chiamare il pulsante '(" aggiorna ")' dopo aver cambiato lo stato del pulsante (preferibilmente con 'prop ('checked', boolvalue)') –

1

Se qualcuno sta ancora ricevendo questo problema, fare uso di:

.prop('checked',true); 

invece di:

.attr("checked", true); 
Problemi correlati