为什么不(如何)document.getElementsByClassName(“*”)?

时间:2012-08-15 16:05:50

标签: javascript dom

我们可以用

获得所有dom
document.getElementsByTagName("*")

为什么我们不能使用

document.getElementsByClassName("*")

获取所有设置了class属性的标记?

同样使用

document.getElementById("*")

获取设置了id属性的标记?

虽然这些功能不是很必要,也可能没有需求,但我希望有人告诉我如何实现同样的功能。感谢。

4 个答案:

答案 0 :(得分:8)

答案是因为getElementsByClassName()getElementById()不会使用通配符。它们没有规范或编写,所以你不能那样使用它们。

进一步getElementById()只返回一个DOM元素,而不是一个元素数组,因此它永远不会以这种方式工作。

如果你想获得所有带有类名的元素或所有带有id的元素,你可以这样做:

function getAllElementsWithAttribute(attr) {
    var results = [];
    var all = document.getElementsByTagName("*");
    for (var i = 0, len = all.length; i < len; i++) {
        if (all[i][attr]) {
            results.push(all[i]);
        }
    }
    return(results);
}

然后,您可以使用以下内容获取具有类名的所有元素:

var items = getAllElementsWithAttribute("className");

或者,获取带有ID的所有元素:

var items = getAllElementsWithAttribute("id");

答案 1 :(得分:0)

正如@ jfriend00在answer before中建议的那样,javascript的浏览器实现中本机不存在该功能。同样,答案还包含使用纯JavaScript进行此操作的方法。

或者,您必须使用基于javascript的框架,并为您提供更好的选择器。

因此,考虑到一个这样的框架jQuery,您可以:

选择class的所有元素:

$('[class]')

选择id的所有元素:

$('[id]')

答案 2 :(得分:0)

getElementsByClassName()未在所有浏览器上实施,最明显的是Internet Explorer。但是,您可以使用各种JavaScript库(例如jQuery)以跨浏览器方式实现此功能。默认函数都没有使用通配符*来获取所有值。虽然你可以使用jquery这样做$('[id]'),如SO帖子所示:jquery get only all html elements with ids

答案 3 :(得分:-1)

这是getElementByClass的快速链接 - http://www.actiononline.biz/web/code/how-to-getelementsbyclass-in-javascript-the-code/ - 您可以修改代码,通过将if语句修改为

来返回非空类的所有元素
if (allHTMLTags[i].className!="") {

要获取具有id的所有元素,只需获取所有元素并丢弃那些没有id的元素。