以下脚本使我感到惊讶。它产生以下结果:
互联网浏览
aaa:未定义bbb:未定义ccc:value3 ddd:value4 eee:value5
FireFox和Chrome
aaa:bbb:ccc:value3 ddd:value4 eee:value5
为什么当一个输入与另一个输入的名称具有相同的ID(或相反)时,该输入没有值?
function testResults(form) {
alert([
"aaa: " + form.aaa.value,
"bbb: " + form.bbb.value,
"ccc: " + form.ccc.value,
"ddd: " + form.ddd.value,
"eee: " + form.eee.value
].join(', '));
}
<form>
<input type="text" name="aaa" id="bbb" value="value1" />
<input type="text" name="bbb" id="aaa" value="value2" />
<input type="text" name="ccc" id="ccc" value="value3" />
<input type="text" name="ddd" value="value4" />
<input type="text" id="eee" value="value5" />
<input type="submit" onclick="testResults(this.form)"/>
</form>
在规范中定义了通过名称或ID访问表单元素时使用的算法:
当一个
form
元素被编入索引的命名属性检索,用户代理必须执行下列步骤:
让候选
RadioNodeList
对象为一个活动对象,其中包含所有列出的元素,其形式拥有者是form
具有id
属性或name
等于nameinput
的type
属性的元素,但其属性处于树形图像按钮状态的元素除外。如果候选人为空,则使候选人成为一个活动
RadioNodeList
对象,其中包含作为img
元素后代的所有元素,form
并具有按树顺序的id
属性或name
等于name的属性。如果候选人为空,则name是
form
元素的过去名称映射中条目之一的名称:返回与该映射中的name关联的对象。如果候选者包含多个节点,请返回候选者并中止这些步骤。
否则,候选对象仅包含一个节点。在元素的过去名称映射中的候选项中添加从名称到节点的映射,将先前的条目替换为相同的名称(如果有)。
form
返回候选节点。
具体来说,问题在于有两个候选项form.aaa
,因此它返回一个RadioNodeList
集合(步骤4):
form.aaa; // RadioNodeList [ <input#bbb>, <input#aaa> ]
form.aaa[0]; // <input#bbb>
form.aaa[1]; // <input#aaa>
因为form.eee
只有一个候选者,所以将其返回(步骤6):
$0.eee; // <input#eee>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句