Javascript:如何循环遍历页面上的所有DOM元素?

Javascript:如何循环遍历页面上的所有DOM元素?,javascript,dom,Javascript,Dom,我试图循环一个页面上的所有元素,所以我想检查这个页面上存在的每个元素是否有一个特殊的类 那么,我怎么说我想检查每个元素呢?您可以将*传递给,这样它将返回页面中的所有元素: var all = document.getElementsByTagName("*"); for (var i=0, max=all.length; i < max; i++) { // Do something with the element here } 这无疑会加快现代浏览器的

我试图循环一个页面上的所有元素,所以我想检查这个页面上存在的每个元素是否有一个特殊的类


那么,我怎么说我想检查每个元素呢?

您可以将
*
传递给,这样它将返回页面中的所有元素:

var all = document.getElementsByTagName("*");

for (var i=0, max=all.length; i < max; i++) {
     // Do something with the element here
}
这无疑会加快现代浏览器的速度


浏览器现在支持。这意味着您可以直接循环元素,而不是编写自己的for循环

document.querySelectorAll('*').forEach(function(node) {
    // Do whatever you want with the node object.
});
性能说明-通过使用特定的选择器,尽最大努力确定所需的范围。通用选择器可以根据页面的复杂性返回大量节点。此外,考虑使用<代码>文档.Boo.QueRealStudioOrth/<代码>,而不是<代码>文档。QueRealStudioOrth/<代码>当您不关心<代码> <代码>儿童> < /P> 你可以试试看
document.getElementsByClassName('special_class')

下面是另一个关于如何循环浏览文档或元素的示例:

function getNodeList(elem){
var l=new Array(elem),c=1,ret=new Array();
//This first loop will loop until the count var is stable//
for(var r=0;r<c;r++){
    //This loop will loop thru the child element list//
    for(var z=0;z<l[r].childNodes.length;z++){

         //Push the element to the return array.
        ret.push(l[r].childNodes[z]);

        if(l[r].childNodes[z].childNodes[0]){
            l.push(l[r].childNodes[z]);c++;
        }//IF           
    }//FOR
}//FOR
return ret;
}
函数getNodeList(elem){
var l=新数组(elem),c=1,ret=新数组();
//第一个循环将循环,直到count变量稳定//
对于(var r=0;r来自此链接

<html>
<head>
<title>A Simple Page</title>
<script language="JavaScript">
<!--
function findhead1()
{
    var tag, tags;
    // or you can use var allElem=document.all; and loop on it
    tags = "The tags in the page are:"
    for(i = 0; i < document.all.length; i++)
    {
        tag = document.all(i).tagName;
        tags = tags + "\r" + tag;
    }
    document.write(tags);
}

//  -->
</script>
</head>
<body onload="findhead1()">
<h1>Heading One</h1>
</body>
</html>

简单的一页
标题一
更新:编辑

自从我上次回答后,我找到了更好更简单的解决方案

function search(tableEvent)
    {
        clearResults()

        document.getElementById('loading').style.display = 'block';

        var params = 'formAction=SearchStocks';

        var elemArray = document.mainForm.elements;
        for (var i = 0; i < elemArray.length;i++)
        {
            var element = elemArray[i];

            var elementName= element.name;
            if(elementName=='formAction')
                continue;
            params += '&' + elementName+'='+ encodeURIComponent(element.value);

        }

        params += '&tableEvent=' + tableEvent;


        createXmlHttpObject();

        sendRequestPost(http_request,'Controller',false,params);

        prepareUpdateTableContents();//function js to handle the response out of scope for this question

    }
函数搜索(tableEvent)
{
clearResults()
document.getElementById('loading').style.display='block';
var参数='formAction=SearchStocks';
var elemArray=document.mainForm.elements;
for(var i=0;i
正在寻找相同的节点。嗯,不完全是。我只想列出所有DOM节点

var currentNode,
    ni = document.createNodeIterator(document.documentElement, NodeFilter.SHOW_ELEMENT);

while(currentNode = ni.nextNode()) {
    console.log(currentNode.nodeName);
}
为了获得具有特定类的元素,我们可以使用filter函数

var currentNode,
    ni = document.createNodeIterator(
                     document.documentElement, 
                     NodeFilter.SHOW_ELEMENT,
                     function(node){
                         return node.classList.contains('toggleable') ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;
                     }
         );

while(currentNode = ni.nextNode()) {
    console.log(currentNode.nodeName);
}
找到解决方案
安迪E.给出了一个很好的回答

我想补充一点,如果您想在某个特殊的选择器中选择所有的子对象(我最近遇到了这种需要),那么您可以在任何DOM对象上应用“getElementsByTagName()”方法

例如,我只需要解析网页的“可视”部分,所以我做了这个

var visualDomElts = document.body.getElementsByTagName('*');

这将永远不会考虑头部部分。

对于使用Jquery的用户

$("*").each(function(i,e){console.log(i+' '+e)});

通常,最好的解决方案是使用递归:

loop(document);
function loop(node){
    // do some thing with the node here
    var nodes = node.childNodes;
    for (var i = 0; i <nodes.length; i++){
        if(!nodes[i]){
            continue;
        }

        if(nodes[i].childNodes.length > 0){
            loop(nodes[i]);
        }
    }
}
循环(文档);
函数循环(节点){
//对这里的节点执行一些操作
var nodes=node.childNodes;
对于(变量i=0;i 0){
循环(节点[i]);
}
}
}
与其他建议不同,此解决方案不需要为所有节点创建数组,因此内存更轻松。更重要的是,它可以找到更多的结果。我不确定这些结果是什么,但在chrome上测试时,与
document.getElementsByTagName(“*”)相比,它可以找到大约50%的节点;

使用
*

var allElem = document.getElementsByTagName("*");
for (var i = 0; i < allElem.length; i++) {
    // Do something with all element here
}
var-allegem=document.getElementsByTagName(“*”);
对于(var i=0;i
我认为这真的很快

document.queryselectoral('body,body*').forEach(function(e){

如果需要检查每个元素,则使用
var all=document.getElementsByTagName(“*”);for(var i=0,max=all.length;i
下面是一个递归实现,它只检查或循环所有DOM元素的每个元素一次,然后追加:

(这里是@George Reith的递归答案:)

函数mapDOMCheck(html_字符串,json){
treeObject={}
dom=new jsdom.jsdom(html_string)//使用jsdom,因为DOMParser不提供用于元素访问的客户端窗口
document=dom.window.document
元素=document.querySelector('html')
//只递归和循环DOM元素一次
函数树HTML(元素、对象){
var nodeList=element.childNodes;
if(节点列表!=null){
if(节点列表长度){
object[element.nodeName]=[];//IMPT:empty[]数组,用于父节点推送非文本可递归元素(见下文)
对于(变量i=0;i
您确定要自己循环遍历每个元素吗?为什么不使用jquery和选择器来获取属于该特定类的元素?没有document.getElementsByTagName方法吗?*TL;DR:对于仅可见的元素,使用:
document.body.getElementsByTagName('*')
使用:
For(…of…){}
I使用:
Array.from(document.querySelectorAll('*').forEach(el=>{})
正确的方法是
getElementsByClassName()
,Internet Explorer在版本9之前不支持它。这种方法看起来很好,但是我如何在上面的方法中选择元素?我只得到了索引“I”?@Florian:就像你访问数组元素一样
var allElem = document.getElementsByTagName("*");
for (var i = 0; i < allElem.length; i++) {
    // Do something with all element here
}
function mapDOMCheck(html_string, json) {
  treeObject = {}

  dom = new jsdom.JSDOM(html_string) // use jsdom because DOMParser does not provide client-side Window for element access
  document = dom.window.document
  element = document.querySelector('html')

  // Recurse and loop through DOM elements only once
  function treeHTML(element, object) {
    var nodeList = element.childNodes;

    if (nodeList != null) {
      if (nodeList.length) {
        object[element.nodeName] = []; // IMPT: empty [] array for parent node to push non-text recursivable elements (see below)

        for (var i = 0; i < nodeList.length; i++) {
          console.log("nodeName", nodeList[i].nodeName);

          if (nodeList[i].nodeType == 3) { // if child node is **final base-case** text node
            console.log("nodeValue", nodeList[i].nodeValue);
          } else { // else
            object[element.nodeName].push({}); // push {} into empty [] array where {} for recursivable elements
            treeHTML(nodeList[i], object[element.nodeName][object[element.nodeName].length - 1]);
          }
        }
      }
    }
  }

  treeHTML(element, treeObject);

}