Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用getElementsByName获取多个元素,更改它们的名称会得到奇怪的结果_Javascript_Html_Getelementsbyname - Fatal编程技术网

Javascript 使用getElementsByName获取多个元素,更改它们的名称会得到奇怪的结果

Javascript 使用getElementsByName获取多个元素,更改它们的名称会得到奇怪的结果,javascript,html,getelementsbyname,Javascript,Html,Getelementsbyname,我有一个表单,其中有多个同名的输入(文本)元素 <input name="val[]" type="text" /> <input name="val[]" type="text" /> <input name="val[]" type="text" /> 这很有效 但后来,我想如果我可以这样编码: while( vals=document.getElementsByName("val[]") ) vals[0].name="val2[]"; 这给

我有一个表单,其中有多个同名的输入(文本)元素

<input name="val[]" type="text" />
<input name="val[]" type="text" />
<input name="val[]" type="text" />
这很有效

但后来,我想如果我可以这样编码:

while( vals=document.getElementsByName("val[]") )
    vals[0].name="val2[]";
这给了我与上面“无法设置未定义的属性“name”相同的错误”
我很困惑。我还用Firefox测试了它,结果是一样的。(无法在IE上测试,因为我在页面上使用HTML5原生DnD)

在我看来,getElementsByName在更改名称时返回的是一个队列,就像从队列中删除项目一样。

这是真的吗?或者对此的正确解释是什么?

发生这种情况是因为您更改了属性,您将该属性用作
文档的选择器。getElementsByName
并将
节点列表
对象返回给您,而不是
数组
<代码>节点列表它是DOM元素()的实时集合。因此,在命名属性修改之后,它将包含少于3个元素()

试着像下面的例子那样修改代码,这将解决您的问题,因为您将得到一个静态的
数组
,而不是
节点列表
()

var vals=[].slice.call(document.getElementsByName(“val[]);
var valct=vals.length;

对于(var i=0;i发生这种情况是因为您更改了属性,您将该属性用作
document.getElementsByName
的选择器,它将
节点列表
对象返回给您,而不是
数组
节点列表
它是DOM元素的实时集合()。因此,在命名属性修改后,它将包含少于3个元素()

试着像下面的例子那样修改代码,这将解决您的问题,因为您将得到一个静态的
数组
,而不是
节点列表
()

var vals=[].slice.call(document.getElementsByName(“val[]);
var valct=vals.length;

对于(var i=0;i发生这种情况是因为您更改了属性,您将该属性用作
document.getElementsByName
的选择器,它将
节点列表
对象返回给您,而不是
数组
节点列表
它是DOM元素的实时集合()。因此,在命名属性修改后,它将包含少于3个元素()

试着像下面的例子那样修改代码,这将解决您的问题,因为您将得到一个静态的
数组
,而不是
节点列表
()

var vals=[].slice.call(document.getElementsByName(“val[]);
var valct=vals.length;

对于(var i=0;i发生这种情况是因为您更改了属性,您将该属性用作
document.getElementsByName
的选择器,它将
节点列表
对象返回给您,而不是
数组
节点列表
它是DOM元素的实时集合()。因此,在命名属性修改后,它将包含少于3个元素()

试着像下面的例子那样修改代码,这将解决您的问题,因为您将得到一个静态的
数组
,而不是
节点列表
()

var vals=[].slice.call(document.getElementsByName(“val[]);
var valct=vals.length;

因为(var i=0;我明白了。谢谢你的回答:)我明白了。谢谢你的回答:)我明白了。谢谢你的回答:)我明白了。谢谢你的回答:)
vals[ 0 ].name="val2[]";
while( vals=document.getElementsByName("val[]") )
    vals[0].name="val2[]";
var vals = [].slice.call(document.getElementsByName("val[]"));
var valct = vals.length;
for( var i=0; i<valct; ++i ) {
    vals[i].name="val2[]";
}