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

IT技术 javascript html dom
2021-02-11 11:12:27

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

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

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

5个回答

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

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

编辑: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);
    }
}
@AndersonGreen 如果您考虑一下,它就会出现在您身上。
2021-03-17 11:12:27
这个例子对我不起作用好像elem没有定义。我在这里做错了什么?
2021-03-18 11:12:27
@AndersonGreen 问题中没有出现“递归”这个词。交互并不意味着递归。您必须自己实现递归。
2021-03-20 11:12:27
也适用于 Opera 和 Safari。
2021-03-30 11:12:27
我不确定 for 循环是否足够复杂以将其称为算法。我也不太确定你从哪里得到这需要O(n²)时间的概念elem.attributes.length很可能是O(1)elem.attributes[i]绝对是O(1) - 所以在我看来,整个事情是O(n)但即使我错了:也没关系如果您为页面上的每个元素都调用它,那么无论如何您都做错了。地狱,即使那样,在我生rust的笔记本电脑上,这个页面也只需要 8 毫秒。这就是 jQuery $.each()简而言之:我根本不在乎这个位的运行时特性。
2021-03-30 11:12:27

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

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

如果有人对过滤版本感兴趣,或者正在尝试构建 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]

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

更高效

Array.prototype.forEach.call(elm.attributes, attr => console.log(attr))

最简单的方法是使用扩展运算符。

const el = document.querySelector('div');

[...el.attributes].forEach((attr) => {
  console.log(attr.name + ' = ' + attr.value);
});
<div class="foo" id="bar"></div>