IE8 JavaScript: comportement select.options
-
08-07-2019 - |
Question
J'ai découvert aujourd'hui un comportement étrange dans la mise en oeuvre par IE8 de la propriété 'options' de l'élément de sélection DOM.
Étant donné le code HTML suivant:
<select id="sel"><option value="val">An option</option></select>
Et le javascript:
var sel = document.getElementById('sel');
alert(sel === sel.options); //alerts 'true' in IE8
Évidemment, l’intelligent collègue qui a écrit l’implémentation select sur IE8 a écrit un indexeur sur l’élément select, puis s’est exposé comme sa propre propriété 'options' à JavaScript.
Ma question est : cette fonctionnalité est-elle attendue, conformément aux spécifications du langage JavaScript? Est-ce un bug connu? Devrais-je continuer à traiter la propriété 'options' comme un objet plutôt que comme un tableau?
Ce n'est pas ainsi que l'élément Select DOM se comporte sous Firefox 3.5, Chrome 1.0 ou Safari 3.1, où la propriété "options" est exposée sous la forme d'un tableau JavaScript ...
Pour référence, je suis tombé sur cette information en transmettant la propriété "options" au constructeur jQuery afin d'envelopper ses éléments. Plutôt que le résultat attendu d'un objet jQuery avec des éléments X (comme cela s'est produit avec Firefox, Chrome et Safari), un objet jQuery avec 1 élément (l'élément select lui-même) m'a été renvoyé.
La solution
Tout d’abord, cela n’est pas lié au langage JavaScript, mais au DOM:)
Nitpicking mis à part, DOM L2, par exemple, définit HTMLSelectElement
en tant qu'objet ayant la propriété options
. Cette propriété est définie comme étant du type HTMLOptionsCollection
et représente - "La collection d'éléments OPTION contenus dans cet élément."
Maintenant, pour citer HTMLOptionsCollection
:
Une HTMLOptionsCollection est une liste de noeuds représentant l'option HTML élément. Un nœud individuel peut être accessible soit par index ordinal ou le nom du nœud ou ses attributs.
Remarque: les collections du domaine HTML HTML sont supposé être en direct ce qui signifie qu'ils sont automatiquement mis à jour lorsque le le document sous-jacent est modifié.
Techniquement, rien n'empêche HTMLSelectElement
d'être égal à son HTMLOptionsCollection
(au moins dans les spécifications DOM L2). L'implémentation est entièrement conforme tant qu'elle correspond au comportement standard (c'est-à-dire que les éléments sont accessibles par index ou nom / id et propriétés / méthodes d'interface - tels que élément
et longueur
- sont implémentés comme spécifié).
Franchement, je ne vois pas pourquoi vous vous soucieriez de cette particularité. Si accéder aux éléments par index / nom fonctionne, peu importe ce que options
est égal à. Comme toujours, le mieux est de concevoir des scripts conformes aux normes (et de ne contourner que les lacunes identifiées).