Question

Arrière plan

Selon le Whatwg someForm.elements devrait retourner un HTMLFormElementsCollection.

UN HTMLFormElementsCollection Renvoie un RadioNodeList Si plusieurs éléments partagent le même nom.

La RadioNodeList a spécial value Sémantique où il renvoie la valeur de la première liste de radio vérifiée dans le Nodelist.

Cela permettrait au Après la réponse au travail si elle était mise en œuvre

je tenté naïvement un polyfill Cela est basé sur les objets hôtes qui se comportent bien (selon WebIDL), ce qu'ils ne sont clairement pas.

Question

Quelle est une implémentation efficace alternative pour ce polyfill pendant que nous attendons que les navigateurs deviennent conformes au radionodéliste ou à WebIDL?

Exemple de code de référence

<form name="myform">
    <input type="radio" name="foo" value="10" /> foo 
    <input type="radio" name="foo" value="30" /> bar 
</form>

var myform = document.forms.myform;

var radio = myform.elements.foo;
var price = radio.value;

Code de référence de tentative naïve

(function () {
    var pd = Object.getOwnPropertyDescriptor(HTMLFormElement.prototype, "elements"),
        getElements = pd.get;

    pd.get = get;

    Object.defineProperty(HTMLFormElement.prototype, "elements", pd);

    function get() {
        var elements = getElements.call(this);

        if (elements.length) {
            Object.defineProperty(elements, "value", {
                get: getRadioNodeListValue,
                set: setRadioNodeListValue,
                configurable: true
            });
        }

        return elements;
    }

    function getRadioNodeListValue() {
        for (var i = 0, len = this.length; i < len; i++) {
            var el = this[i];
            if (el.checked) {
                return el.value;   
            }
        }
    }

    function setRadioNodeListValue(value) {
        for (var i = 0, len = this.length; i < len; i++) {
            var el = this[i];
            if (el.checked) {
                el.value = value;
                return;   
            }
        }    
    }
}());

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top