根据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;
}
}
}
}());
答案 0 :(得分:4)
如果您可以接受将value
吸气器固定在NodeList
上,那么以下内容应该可以正常工作
归功于@@ Esailija
您也可以将.value添加到NodeList原型
答案 1 :(得分:4)
为什么呢?您知道,要求ES5和WebIDL在今天的网络上的常用浏览器中都会失败。您的代码需要新功能,包括ES5)Object.getOwnPropertyDescriptor
,get
/ set
),并且正如您提到的WebIDL接口对象表现良好。
HTML5 polyfill旨在推广并且通常在实现时失败。这是一种有害的趋势。
请勿修改其他对象。特别是寄主物品
如果与HTML5定义存在任何差异(并且存在),当第二个功能测试脚本试图检测一组无线电上是否存在value
属性时,会出现问题,然后假设标准支持。它远离HTML5中的两步算法。
您的代码仅在elements.length > 0
时填充并影响复选框(请记住,无线电不是唯一具有checked
属性的元素)。你的setter改变了第一个被检查的无线电的值。不应该设置值检查该名称的第一个未经检查的无线电,具有该值吗?
相反,编写只需要它们一般的函数。
function getRadioValue(form, radioName) {
// Delete comment, write code.
}
function setRadioValue(form, radioName, value) {
// Delete comment, write code.
}