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

标签 javascript html getelementsbyname

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

<input name="val[]" type="text" />
<input name="val[]" type="text" />
<input name="val[]" type="text" />

现在,假设我想将它们的名称更改为“val2[]”。

这是我最初写的:

var vals=document.getElementsByName("val[]");
var valct=vals.length;
    for( var i=0; i<valct; i++ )
        vals[i].name="val2[]";

但是这似乎给我带来了错误。
Chrome 的开发者工具显示“无法设置未定义的属性‘名称’”

思考了一段时间,我认为重命名后该元素可能会被删除。
因此,我将代码的最后一行更改为:

vals[ 0 ].name="val2[]";

这有效!

但是后来,我在想是否可以这样编码:

while( vals=document.getElementsByName("val[]") )
    vals[0].name="val2[]";

这给了我与上面“无法设置未定义的属性'名称'”相同的错误
我很困惑。我也用Firefox测试了,结果是一样的。 (无法在IE上测试,因为我在页面上使用了HTML5原生DnD)

在我看来, getElementsByName 返回的是一个队列,而更改名称则相当于从队列中删除项目。
这是真的?或者对此的正确解释是什么?

最佳答案

发生这种情况是因为您更改了属性,您将其用作 document.getElementsByName 的选择器,并且它返回 NodeList 对象给您,而不是 Array. NodeList 它是 DOM 元素的实时集合 ( ref )。因此,在您修改 name 属性后,它将包含少于 3 个元素 ( demostration )。

尝试像下面的示例那样修改代码,这将解决您的问题,因为您将得到一个静态 Array 而不是 NodeList ( jsfiddle )。

var vals = [].slice.call(document.getElementsByName("val[]"));
var valct = vals.length;
for( var i=0; i<valct; ++i ) {
    vals[i].name="val2[]";
}

关于javascript - 使用 getElementsByName 获取多个元素,更改它们的名称会得到奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20238321/

相关文章:

html - Chrome 无法滚动

javascript - 一个 <option> 可以有多个名称吗?获取<option>的数据属性?

javascript - 无法获取未定义或空引用的 GetElementsbyTagName 属性

javascript - 你能强制IE8识别背景大小: 100%?吗

javascript - 有没有办法通过 Chrome 扩展禁用 chrome_url_overrides?

css - 将列表显示为菜单,然后展开 div 以填充剩余宽度

html - 为什么 chrome 不对齐此文本?

javascript - document.getElementsByTagName 的本地副本

javascript - 如何在ckeditor中设置默认字体名称preety

javascript - HTTP 请求返回 200 OK 但没有响应内容