如何遍历HTML元素中的所有属性?

Rob*_*cks 43 html javascript dom

我需要JavaScript代码来遍历HTML元素中的填充属性.

这个Element.attributes ref说我可以通过索引访问它,但是没有指定它是否得到很好的支持并且可以使用(跨浏览器).

还是其他任何方式?(不使用任何框架,如jQuery/Prototype)

Tom*_*lak 49

这适用于IE,Firefox和Chrome(有人可以测试其他人吗? - 谢谢,@ Bryan):

for (var i = 0; i < elem.attributes.length; i++) {
    var attrib = elem.attributes[i];
    console.log(attrib.name + " = " + attrib.value);
}
Run Code Online (Sandbox Code Playgroud)

编辑:IE迭代所讨论的DOM对象支持的所有属性,无论它们是否实际上已经在HTML中定义.

您必须查看attrib.specifiedBoolean属性以确定该属性是否实际存在.Firefox和Chrome似乎也支持这个属性:

for (var i = 0; i < elem.attributes.length; i++) {
    var attrib = elem.attributes[i];
    if (attrib.specified) {
        console.log(attrib.name + " = " + attrib.value);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 也适用于Opera和Safari. (3认同)
  • @AndersonGreen如果你想一下它会来找你. (3认同)
  • 我不确定 for 循环是否足够复杂以将其称为算法。我也不太确定你从哪里得到这需要 *O(n²)* 时间的概念。`elem.attributes.length` 很可能是 *O(1)*,`elem.attributes[i]` 肯定是 *O(1)* - 所以我认为整个事情是 *O(n)*。但即使我错了:*没关系*。如果您为页面上的每个元素都调用它,那么无论如何您都做错了。地狱,即使那样,在我生锈的笔记本电脑上,这个页面也只需要 8 毫秒。这就是 jQuery `$.each()`。简而言之:我根本不在乎这个位的运行时特性。 (2认同)

Llo*_*oyd 7

另一种方法是使用Array.from以下方法将属性集合转换为数组:

Array.from(element.attributes).forEach(attr => {
  console.log(`${attr.nodeName}=${attr.nodeValue}`);
})
Run Code Online (Sandbox Code Playgroud)


N-a*_*ate 5

如果有人对过滤版本感兴趣,或者正在尝试构建 CSS 属性选择器,请访问:

let el = document.body;
Array.from(el.attributes)
    .filter(a => { return a.specified && a.nodeName !== 'class'; })
    .map(a => { return '[' + a.nodeName + '=' + a.textContent + ']'; })
    .join('');

//outputs: "[name=value][name=value]
Run Code Online (Sandbox Code Playgroud)

您当然可以删除连接以检索数组或为“样式”添加过滤器,因为在大多数 Web 应用程序中,样式标记被小部件广泛操纵。