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

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

La zone de sélection ci-dessus choisirait la troisième option par défaut sans aucun problème. Cependant, si vous vérifiez les éléments avec Firebug, aucun attribut selected="selected" n'est présent dans le <option> choisi.jQuery Impossible de définir "selected" = "selected" via attr() sur <option> éléments?

Je sais que ce n'est pas un gros problème car il fonctionne encore mais j'ai besoin de selected="selected" pour que mes autres scripts puissent l'attraper et effectuer d'autres traitements. Y a-t-il des solutions de contournement?

Merci.

Répondre

23

L'attribut selected fait et non correspondent à l'état de sélection actuel de l'option. L'attribut selected correspond à l'option par défaut, qui sera restaurée si .reset() est appelée (ou si un bouton type="reset" est cliqué) sur le formulaire. L'état actuel de sélection est accessible à l'aide de la propriété DOM selected, tandis que la sélection par défaut, telle que reflétée par l'attribut, est accessible sous la propriété DOM defaultSelected.

va de même pour value vs defaultValue sur <input type="text">/<textarea> et checked/defaultChecked sur type="checkbox"/"radio".

Le nom attr() de jQuery porte un nom trompeur, et ses tentatives pour prétendre attributs et propriétés sont les mêmes. Lorsque vous utilisez attr(), vous accédez généralement à la propriété, pas l'attribut. Par conséquent, $(el).attr('selected', 'selected') est en train de faire el.selected= 'selected'. Cela fonctionne car 'selected', comme avec toute chaîne non vide, est 'vérité': il est converti en el.selected= true. Mais cela ne touche à aucun moment l'attribut selected="selected".

IE complique encore la situation déjà confusion (a) obtenir getAttribute/setAttribute mal il accède aux propriétés au lieu des attributs (ce qui est la raison pour laquelle vous ne devriez jamais utiliser ces méthodes dans un document HTML), et (b) de manière incorrecte mappant l'état actuel du formulaire sur les attributs HTML, de sorte que les attributs apparaissent réellement dans ce navigateur.

mais j'ai besoin selected = "selected" il

Pourquoi? Etes-vous en série le formulaire à innerHTML? Cela n'inclura pas les valeurs de champ de formulaire (encore une fois, sauf dans IE à cause du bogue), donc ce n'est pas un moyen utilisable pour stocker des valeurs de champs.

+0

+1 pour une bonne réponse. – Jakub

+0

Merci. L'autre script _use_ l'option actuellement sélectionnée (à partir de DOM), ou l'option par défaut si rien n'a encore été sélectionné pour un traitement ultérieur. Après avoir lu votre réponse, Afin de laisser ce script choisir l'option actuellement sélectionnée, je suppose que la méthode correcte serait de définir la propriété DOM 'selected' au lieu d'utiliser' selected = "sélectionné" '? – user435216

+0

Oui. Bien qu'il existe également des conditions limitées dans lesquelles certains navigateurs définissent également la valeur actuelle lorsque vous définissez la valeur par défaut. aaaargh! – bobince

1

Il devrait être $('.test').attr('selected', true);​

également

<option selected>value</option>

Il ne sera pas affiché comme selected="selected"

+0

Je ne pense pas que la valeur de l'attribut 'selected' ait de l'importance (cela n'a pas besoin d'être vrai, ce pourrait être n'importe quelle valeur). Juste le fait qu'il est présent est suffisant pour le sélectionner. – letronje

+0

@letronje: vrai, cependant je viens de suivre le format jQuery standard '.attr (attributeName, value)' – Jakub

+0

Mon point est que $ ('. Test'). Attr ('selected', 'selected'); fonctionne aussi ~> http://jsfiddle.net/MZYN7/1/ – letronje

Questions connexes