编程语言
首页 > 编程语言> > javascript – 如何polyfill RadioNodeList?

javascript – 如何polyfill RadioNodeList?

作者:互联网

背景

根据WHATWG,someForm.elements应返回HTMLFormElementsCollection.

如果多个元素共享相同的名称,则HTMLFormElementsCollection将返回RadioNodeList.

RadioNodeList具有特殊的value语义,它返回节点列表中第一个检查的无线电列表的值.

这将允许following answer to work if it were implemented

I naively attempted a polyfill基于主机对象表现良好(根据WebIDL),但它们显然不是.

当我们等待浏览器成为RadioNodeList或WebIDL兼容时,这个polyfill的另一种有效实现是什么?

示例参考代码

<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;

天真的尝试参考代码

(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;   
            }
        }    
    }
}());

解决方法:

如果您可以接受将值getter连接到NodeList上,那么以下内容应该可以正常工作

RadioNodeList polyfill

感谢@@ Esailija

you could also just add .value to NodeList prototype

标签:polyfills,javascript
来源: https://codeday.me/bug/20191009/1876244.html