javascript - 如何填充 RadioNodeList?

标签 javascript polyfills

背景

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

HTMLFormElementsCollection 返回 RadioNodeList如果多个元素共享相同的名称。

RadioNodeList 有特殊的 value它返回节点列表中第一个检查的 radio 列表的值的语义。

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

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

最佳答案

如果您可以接受将 value getter 连接到 NodeList 上,那么以下应该可以工作

RadioNodeList polyfill

感谢@@Esailija

you could also just add .value to NodeList prototype

关于javascript - 如何填充 RadioNodeList?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8941984/

相关文章:

javascript - 我如何使用 babel polyfill 来支持 gulp 的所有 IE11 问题

javascript - 尽管添加了 polyfill,WebP 图像不会在 safari 中显示

css - rem polyfill 不工作

javascript - Object doesn't support this property or method EmberJs IE 8 问题

javascript - 在 Cypress 中保存变量

javascript - 在 jQuery 布局插件上调整大小时,放置在调整器上的按钮消失

javascript - Algolia 即时搜索 Firebase 云功能 - 如何获取其他值?

internet-explorer - 是否有针对 Internet Explorer 的自定义元素 polyfill?

javascript - event.target.id VS event.currentTarget.id VS this.id

javascript - JS悬停元素之间的负空间