2010-09-21 13 views
46

Tengo un conjunto de botones de opción, todos con estilo con la interfaz de usuario de jQuery .button().Botón de radio de la interfaz de usuario de jQuery: cómo cambiar correctamente el estado de verificación

Quiero cambiar su estado verificado. Sin embargo, cuando lo hago programáticamente el evento de cambio del contenedor con:

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

Los valores se cambian correctamente, pero el estilo de interfaz de usuario sigue mostrando el botón de opción sin marcar con el estilo marcado, y el comprobado todavía se ve sin marcar.

Revisé la documentación de la jQuery UI en el método button() para botones de opción, pero no hay nada sobre cómo cambiar el estado y actualizar el estilo de la interfaz de usuario.

La cuestión básica del problema es que llamar al código $("selector").button("disable"); no cambia el estado activo del botón: el botón de opción subyacente está correctamente marcado, pero el estado de la UI activa no cambia. Entonces, aparece un botón en gris que parece que todavía está marcado, y el botón real seleccionado aparece sin marcar.

Solución

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

Antony, lo probamos y el botón ("enable") no funciona para yo. No debería ser como * $ ("selector"). Attr ('verificado', verdadero) .button ("refresh"); *? –

Respuesta

55

es necesario llamar al método refresh después de cambiar el estado subyacente:

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

Ejemplo de trabajo: http://jsbin.com/udowo3

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

que utiliza identificaciones de los radios, pero no importa siempre que obtenga una instancia de jQuery que contenga el elemento relevante input[type=radio].

+0

Funcionó - ¡gracias! ¿Por qué tengo que hacer esto? ¿Es esto un error o un mal comportamiento en jQuery UI? –

+0

@Antony: Bueno, no se lanza ningún evento confiable entre navegadores cuando se cambia el estado de las propiedades 'checked' o 'disabled'. Lo que me sorprende es que no están usando CSS para que el navegador maneje el cambio automáticamente, pero espero que tengan una razón (soporte de IE6, tal vez - IE6 no hace selectores de estado en nada que no sean enlaces). La otra sorpresa fue que no proporcionan un método que pueda usar para cambiar el estado 'checked' y actualizar la UI todo a la vez. Aún así, es bastante fácil una vez que lo sabes. :-) –

+0

¡Exactamente! gracias T.J. –

1

Mirando el code, es necesario cambiar la clase ui-state-active, pero la forma más sencilla es probablemente sólo $('someradiobutton').trigger('click') (o si no desea que sus controladores de eventos personalizados para correr, $('someradiobutton').trigger('click.button')).

+0

Cambia el estado del botón de opción subyacente, pero aún no el estilo de la interfaz de usuario ... –

+0

-1: Esto no funcionará con los botones 'jQuery UI' (de lo que se trata la pregunta) ya que crean elementos separados no conectados a la radio original botón. Debe llamar al botón '(" actualizar ")' después de cambiar el estado del botón (preferiblemente con 'prop ('checked', boolvalue)') –

16

A pesar de las publicaciones en sentido contrario, PUEDE hacer referencia a un botón de opción por ID. No sé por qué jQuery UI no se actualiza automáticamente cuando los botones de marcado, pero lo hace de esta manera:

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

Ejemplo de trabajo:

<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

Mi única adición aquí sería usar 'prop' en lugar de 'attr', por lo que es $ ('selector'). prop ("verificado", verdadero) .button ("actualizar"). – MickJ

+0

Cuando pruebo esta solución, aparece el siguiente error: Error no detectado: no puedo llamar a los métodos del botón antes de la inicialización; intentó llamar al método 'actualizar' ¿Alguien sabe qué podría causar esto? – Blake

1

restablecerá todos los botones de radio, pero usted puede obtener más específica con el selector

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

-1: Esto no funcionará con los botones 'jQuery UI' (de lo que se trata la pregunta) ya que crean elementos separados que no están conectados al botón de opción original. Deberá llamar al botón '(" actualizar ")' después de cambiar el estado del botón (preferiblemente con 'prop ('checked', boolvalue)') –

0

Lo resolví restableciendo por completo el Buttonset con setTimeout.

Agregue un evento de clic al botón de radio que necesita confirmación.
Tenga en cuenta el hecho clic 'radioButton' y la completa 'radioSet' en el código de abajo:

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

crear una función muy útil que restablece el Buttonset:

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

Eso es todo.

+1

-1: Esto no funcionará con los botones 'jQuery UI's (que la pregunta se trata de) ya que crean elementos separados que no están conectados al botón de opción original. Debes llamar al botón '(" actualizar ")' después de cambiar el estado del botón (preferiblemente con 'prop ('checked', boolvalue)') –

1

Si alguien todavía está recibiendo este problema, hacer uso de:

.prop('checked',true); 

en lugar de:

.attr("checked", true); 
Cuestiones relacionadas