バックグラウンド
WHATWG によるsomeForm.elements
と、HTMLFormElementsCollection
.
複数の要素が同じ名前を共有している場合、 AHTMLFormElementsCollection
は a を返します。RadioNodeList
には、nodelist 内の最初にチェックされた無線リストの値を返すRadioNodeList
特別なセマンティクスがあります。value
これにより、実装されている場合、次の回答が機能するようになります
私は単純に (WebIDL に従って) 適切に動作するホスト オブジェクトに基づくポリフィルを試みましたが、明らかにそうではありません。
質問
ブラウザが RadioNodeList または WebIDL に準拠するのを待つ間、このポリフィルの代替の効率的な実装は何ですか?
例 参照コード
<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;
}
}
}
}());