2010-09-16 21 views
8
<select> 
    <option>1</option> 
    <option>2</option> 
    <option class="test">3</option> 
</select> 

$('.test').attr('selected', 'selected');​ 

El cuadro de selección de arriba seleccionaría la tercera opción como predeterminada sin ningún problema. Sin embargo,, si comprueba los elementos con Firebug, no hay ningún atributo selected="selected" presente dentro del <option> elegido.jQuery No se puede establecer "seleccionado" = "seleccionado" mediante attr() en <option> elementos?

Sé que esto no es un gran problema, ya que todavía funciona pero necesito selected="selected" allí para que mis otros scripts puedan atraparlo y realizar un procesamiento posterior. ¿Hay alguna solución por ahí?

Gracias.

Respuesta

23

El atributo selected hace no corresponden al estado de selección actual de la opción. El atributo selected corresponde a la selección predeterminada, que se restaurará si se llama a .reset() (o se hace clic en el botón type="reset") en el formulario. Se puede acceder al estado de selección actual usando la propiedad DOM selected, mientras que la selección por defecto, como se refleja en el atributo, se accede bajo la propiedad DOM defaultSelected.

Lo mismo ocurre con value vs defaultValue en <input type="text">/<textarea> y checked/defaultChecked en type="checkbox"/"radio".

jQuery's attr() es un nombre engañoso, y sus intentos de pretender que los atributos y las propiedades son la misma cosa son defectuosos. Cuando utiliza attr(), generalmente accede a la propiedad y no a el atributo. En consecuencia, $(el).attr('selected', 'selected') está realmente haciendo el.selected= 'selected'. Esto funciona porque 'selected', como con cualquier cadena no vacía, es 'verdad': se convierte a el.selected= true. Pero esto no toca en ningún momento el atributo selected="selected".

IE complica aún más esta situación ya confundir por (a) conseguir getAttribute/setAttribute mal por lo que accede a las propiedades en lugar de los atributos (por lo que nunca se debe utilizar estos métodos en un documento HTML), y (b) de forma incorrecta mapear el estado del formulario actual a los atributos HTML, de modo que los atributos realmente aparecen en ese navegador.

pero necesito seleccionado = "seleccionado" no

¿Por qué? ¿Está serializando el formulario al innerHTML? Esto no incluirá valores de campo de formulario (nuevamente, excepto en IE debido al error), por lo que no es una forma utilizable de almacenar valores de campo.

+0

+1 para una excelente respuesta. – Jakub

+0

Gracias. La otra secuencia de comandos _utiliza_ la opción seleccionada actual (de DOM), o la opción predeterminada si todavía no se ha seleccionado nada para su posterior procesamiento. Después de leer su respuesta, para permitir que esa secuencia de comandos elija la opción actualmente seleccionada, supongo que el método correcto sería establecer la propiedad DOM 'seleccionada' en lugar de usar' seleccionado = 'seleccionado' '? – user435216

+0

Sí. Aunque también hay condiciones limitadas donde algunos navegadores * también * configurarán el valor actual cuando establezca el valor predeterminado. aaaargh! – bobince

1

Debe ser $('.test').attr('selected', true);​

también

<option selected>value</option>

No se mostrará como selected="selected"

+0

No creo que importe el valor del atributo "seleccionado" (No tiene por qué ser cierto, podría ser cualquier valor). El solo hecho de que esté presente es suficiente para seleccionarlo. – letronje

+0

@letronje: cierto, sin embargo, acabo de seguir el formato jQuery estándar '.attr (attributeName, value)' – Jakub

+0

Mi punto es que $ ('. Test'). Attr ('selected', 'selected'); también funciona ~> http://jsfiddle.net/MZYN7/1/ – letronje

Cuestiones relacionadas