【问题标题】:How does JavaScript store DOM elements in variables?JavaScript 如何将 DOM 元素存储在变量中?
【发布时间】:2013-06-19 21:38:22
【问题描述】:

我的意思是当您执行以下操作时,JavaScript 如何存储 DOM 元素:

var foo = document.getElementsByTagName('p');

foo 变成了什么?对象数组?以及如何向该变量添加更多元素,例如:

var bar = document.form[0].getElementsByTagName('input'); // 5 elements
var foo = document.form[1].getElementsByTagName('input'); // 4 elements

bar =+ foo;

for (i=0;i<bar.length;i++){
console.log(bar.value); // 9 logged values
}

是否可以将更多相同类型的元素添加到已包含元素的变量中?我是否必须循环遍历要添加的变量中的所有元素并将它们“推送”到我想要所有数据的变量中?

【问题讨论】:

  • 使用 getElementsByTagName() 代替 getElementsByName()
  • 使用 TagName 和 Name 有什么区别?
  • getElementsByTagName() 方法访问具有指定标记名的所有元素,getElementsByName() 方法访问具有指定名称的所有元素。 tagname 是 html 元素标签名称,例如

    ,name 是属性,例如

标签: javascript dom


【解决方案1】:

getElementsByTagName(以及类似的方法,例如getElementsByNamegetElementsByClassName 等)返回一个NodeList(或HTMLCollection,显然取决于浏览器,另请参见Difference between HTMLCollection, NodeLists, and arrays of objects)。

即使它是一个类数组对象,即它具有数字属性和.length 属性,您也不能向其添加新元素。

要修改NodeList,您必须将其转换为常规数组。这可以通过数组方法.slice 轻松实现,同时您可以将两个列表与.concat 合并:

bar = Array.prototype.slice.call(bar).concat(Array.prototype.slice(foo));

这是可行的,因为大多数原生数组方法的定义方式是,参数不必是实际数组,而是类似数组的对象。

NodeList 和最终数组之间值得注意的区别是:

  • 数组不再存在,即添加新的 DOM 节点时集合不会自动更新。
  • 最终(合并)数组中的元素不一定按文档顺序排列。

【讨论】:

  • 感谢您的精彩回答、示例、进一步参考和回答我所有问题的链接!
  • 嗨,菲利克斯,我想你可以帮我解决一个我没有得到任何答案的问题,只有低视图。我将不胜感激! Difference between contentDocument and contentWindow
  • 请注意,对于 IEArray.prototype.slice.call(bar) 不起作用,它将输出错误:"JScript Object Expected" for a workaround loop through all elements in each NodeList and add them to a array a complete example可以在 [[function].apply() 中找到导致 IE 中出现“JScript object expected”错误](stackoverflow.com/q/11112950/1079232)
  • @SamuelLopez:尝试将0 作为第二个参数传递:Array.prototype.slice.call(bar, 0)
  • 所以 IE 支持该方法但它需要 2 个参数?我在搜索有关错误的信息时发现了上面的问题并找到了该示例。
【解决方案2】:

bar =+ foo;

这仅适用于字符串连接,它将是 bar+= foo

但是这里的 bar 和 foo 都是 DOM 对象。所以如果你想添加相同类型的元素,你可以创建一个数组。

例如,

var myArray =[]
myArray.push(foo);
myArray.push(bar);

【讨论】:

  • 您的示例将创建一个包含两个值的数组,它们都是NodeLists,而不是元素。它不会合并NodeLists
  • 他提到他想将元素添加到已经有元素的变量中
【解决方案3】:

foo 成为函数。所以你不能将 foo 添加到 bar 因为那没有意义。这就像尝试做的那样:

document.form[0].getElementsByName('input') document.form[1].getElementsByName('input');

您可以在一个数组中包含多个元素。我发现这是获得您的解决方案的最简单方法。

【讨论】:

  • foo 成为节点列表不起作用
  • ooo 我现在明白了,有什么办法可以将元素存储在变量中,以便以后可以向变量添加更多元素?使用 TagName 会改变@Givi 所说的内容吗?
  • @SamuelLopez Felix Kling 为您的问题提供了完美答案
  • @Givi 是的,他这样做了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
相关资源
最近更新 更多