IE 10:无法获取名称仅由数字组成的元素
IE 10: cannot get elements with name composed with only digit
我在使用 IE 10 时遇到了这个问题。我在 HTML 页面的表单中有这段代码:
<input type='hidden' name='X123' />
<input type='hidden' name='123' />
<input type='hidden' name='00123' />
如果我运行这个JS命令:
document.forms['MyForm'].elements[name];
其中 name
是输入的名称,我只能得到第一个 ('X123'
)。在其他两种情况下,函数 returns undefined
。我在 IE 10 和 Firefox 上测试过它。在 Firefox 上有效。不过在IE下得运行。这是一个 MWE:
<html><head><script type='text/javascript'>
function println(text) {
document.getElementById('output').innerHTML += '<p>' + text + '</p>';
}
function test() {
println('X123 = ' + document.forms['MyForm'].elements['X123']);
println('123 = ' + document.forms['MyForm'].elements['123']);
println('00123 = ' + document.forms['MyForm'].elements['00123']);
}
</script></head><body onload='test();'><form name='MyForm'>
<input type='hidden' name='X123' />
<input type='hidden' name='123' />
<input type='hidden' name='00123' />
</form><div id='output'></div></body></html>
我需要知道这是否是 IE 的已知行为。
更好的解释:我在工作中遇到了这个问题。我制作了 HTML 你看到的 只是为了复制问题 (这不是教程)。我知道我可以使用 jQuery 或其他方法按名称获取元素,但我需要知道这是否是 IE 的已知行为,因为我在网上找不到任何相关信息。
I need to know if this is a known behavior of IE.
不只是IE; that code doesn't work on Chrome or Firefox either, for the 123
element. Grundy seems to have found the relevant info 关于原因,即全数字名称会导致与基于索引的访问混淆,因此无法按名称使用。
...and if exists a workaround.
是的,您可以改用 querySelector
(适用于所有现代浏览器,以及 IE8)。我手边没有 IE10,但它适用于 IE8、IE9、IE11、Chrome 和 Firefox(原始代码在其中任何一个中都不起作用)所以我想说它几乎肯定有效在 IE10 上也是如此:
println('X123 = ' + document.forms['MyForm'].querySelector('[name="X123"]'));
println('123 = ' + document.forms['MyForm'].querySelector('[name="123"]'));
println('00123 = ' + document.forms['MyForm'].querySelector('[name="00123"]'));
请注意 [name="value"]
中值的引号很重要,否则以数字开头的引号是 CSS 语法错误。
实例:
function println(text) {
document.getElementById('output').innerHTML += '<p>' + text + '</p>';
}
function test() {
println('X123 = ' + document.forms['MyForm'].querySelector('[name="X123"]'));
println('123 = ' + document.forms['MyForm'].querySelector('[name="123"]'));
println('00123 = ' + document.forms['MyForm'].querySelector('[name="00123"]'));
}
test();
<form name='MyForm'>
<input type='hidden' name='X123' value="X123 value"/>
<input type='hidden' name='123' value="123 value"/>
<input type='hidden' name='00123' value="00123 value" />
</form><div id='output'></div>
如果你想要它们的值:
println('X123 = ' + document.forms['MyForm'].querySelector('[name="X123"]']).value);
println('123 = ' + document.forms['MyForm'].querySelector('[name="123"]']).value);
println('00123 = ' + document.forms['MyForm'].querySelector('[name="00123"]']).value);
function println(text) {
document.getElementById('output').innerHTML += '<p>' + text + '</p>';
}
function test() {
println('X123 = ' + document.forms['MyForm'].querySelector('[name="X123"]').value);
println('123 = ' + document.forms['MyForm'].querySelector('[name="123"]').value);
println('00123 = ' + document.forms['MyForm'].querySelector('[name="00123"]').value);
}
test();
<form name='MyForm'>
<input type='hidden' name='X123' value="X123 value"/>
<input type='hidden' name='123' value="123 value"/>
<input type='hidden' name='00123' value="00123 value" />
</form><div id='output'></div>
我建议您避免使用以数字开头的名称或 ID,如 HTML4 specification 所说。
您可以通过在名称前加上一些内容来解决这个问题,例如:
name="123" --> name="whatever-123"
您的代码:
document.forms['MyForm'].elements[name];
这是数字名称问题的原因是因为 .elements
可以作为集合引用——即使用数字引用来按顺序获取字段——以及名称。
因此,给它一个数字名称意味着它会混淆您指的是名为“123”的元素还是表单中的第 123 个元素。你说的是前者,但它试图给你后者。
解决方法很简单:只需为它们添加一个字母前缀即可。
我在使用 IE 10 时遇到了这个问题。我在 HTML 页面的表单中有这段代码:
<input type='hidden' name='X123' />
<input type='hidden' name='123' />
<input type='hidden' name='00123' />
如果我运行这个JS命令:
document.forms['MyForm'].elements[name];
其中 name
是输入的名称,我只能得到第一个 ('X123'
)。在其他两种情况下,函数 returns undefined
。我在 IE 10 和 Firefox 上测试过它。在 Firefox 上有效。不过在IE下得运行。这是一个 MWE:
<html><head><script type='text/javascript'>
function println(text) {
document.getElementById('output').innerHTML += '<p>' + text + '</p>';
}
function test() {
println('X123 = ' + document.forms['MyForm'].elements['X123']);
println('123 = ' + document.forms['MyForm'].elements['123']);
println('00123 = ' + document.forms['MyForm'].elements['00123']);
}
</script></head><body onload='test();'><form name='MyForm'>
<input type='hidden' name='X123' />
<input type='hidden' name='123' />
<input type='hidden' name='00123' />
</form><div id='output'></div></body></html>
我需要知道这是否是 IE 的已知行为。
更好的解释:我在工作中遇到了这个问题。我制作了 HTML 你看到的 只是为了复制问题 (这不是教程)。我知道我可以使用 jQuery 或其他方法按名称获取元素,但我需要知道这是否是 IE 的已知行为,因为我在网上找不到任何相关信息。
I need to know if this is a known behavior of IE.
不只是IE; that code doesn't work on Chrome or Firefox either, for the 123
element. Grundy seems to have found the relevant info 关于原因,即全数字名称会导致与基于索引的访问混淆,因此无法按名称使用。
...and if exists a workaround.
是的,您可以改用 querySelector
(适用于所有现代浏览器,以及 IE8)。我手边没有 IE10,但它适用于 IE8、IE9、IE11、Chrome 和 Firefox(原始代码在其中任何一个中都不起作用)所以我想说它几乎肯定有效在 IE10 上也是如此:
println('X123 = ' + document.forms['MyForm'].querySelector('[name="X123"]'));
println('123 = ' + document.forms['MyForm'].querySelector('[name="123"]'));
println('00123 = ' + document.forms['MyForm'].querySelector('[name="00123"]'));
请注意 [name="value"]
中值的引号很重要,否则以数字开头的引号是 CSS 语法错误。
实例:
function println(text) {
document.getElementById('output').innerHTML += '<p>' + text + '</p>';
}
function test() {
println('X123 = ' + document.forms['MyForm'].querySelector('[name="X123"]'));
println('123 = ' + document.forms['MyForm'].querySelector('[name="123"]'));
println('00123 = ' + document.forms['MyForm'].querySelector('[name="00123"]'));
}
test();
<form name='MyForm'>
<input type='hidden' name='X123' value="X123 value"/>
<input type='hidden' name='123' value="123 value"/>
<input type='hidden' name='00123' value="00123 value" />
</form><div id='output'></div>
如果你想要它们的值:
println('X123 = ' + document.forms['MyForm'].querySelector('[name="X123"]']).value);
println('123 = ' + document.forms['MyForm'].querySelector('[name="123"]']).value);
println('00123 = ' + document.forms['MyForm'].querySelector('[name="00123"]']).value);
function println(text) {
document.getElementById('output').innerHTML += '<p>' + text + '</p>';
}
function test() {
println('X123 = ' + document.forms['MyForm'].querySelector('[name="X123"]').value);
println('123 = ' + document.forms['MyForm'].querySelector('[name="123"]').value);
println('00123 = ' + document.forms['MyForm'].querySelector('[name="00123"]').value);
}
test();
<form name='MyForm'>
<input type='hidden' name='X123' value="X123 value"/>
<input type='hidden' name='123' value="123 value"/>
<input type='hidden' name='00123' value="00123 value" />
</form><div id='output'></div>
我建议您避免使用以数字开头的名称或 ID,如 HTML4 specification 所说。
您可以通过在名称前加上一些内容来解决这个问题,例如:
name="123" --> name="whatever-123"
您的代码:
document.forms['MyForm'].elements[name];
这是数字名称问题的原因是因为 .elements
可以作为集合引用——即使用数字引用来按顺序获取字段——以及名称。
因此,给它一个数字名称意味着它会混淆您指的是名为“123”的元素还是表单中的第 123 个元素。你说的是前者,但它试图给你后者。
解决方法很简单:只需为它们添加一个字母前缀即可。