[javascript] Javascript : 페이지의 모든 DOM 요소를 반복하는 방법은 무엇입니까?
페이지의 모든 요소를 반복하려고하므로이 페이지에 존재하는 모든 요소에서 특수 클래스를 확인하고 싶습니다.
그렇다면 모든 요소를 확인하고 싶다고 어떻게 말합니까?
답변
당신은 전달할 수 있습니다 *
에 getElementsByTagName()
이 페이지에있는 모든 요소를 반환되도록 :
var all = document.getElementsByTagName("*");
for (var i=0, max=all.length; i < max; i++) {
// Do something with the element here
}
사용 querySelectorAll()
가능한 경우 (IE9 +, IE8의 CSS)을 사용하여 특정 클래스가있는 요소를 찾을 수 있습니다.
if (document.querySelectorAll)
var clsElements = document.querySelectorAll(".mySpeshalClass");
else
// loop through all elements instead
이것은 확실히 최신 브라우저의 문제를 가속화 할 것입니다.
브라우저는 이제 NodeList에서 foreach를 지원 합니다. 즉, 자신 만의 for 루프를 작성하는 대신 요소를 직접 루프 할 수 있습니다.
document.querySelectorAll('*').forEach(function(node) {
// Do whatever you want with the node object.
});
성능 참고 사항 -특정 선택기를 사용하여 찾고있는 범위를 정하기 위해 최선을 다하십시오. 범용 선택기는 페이지의 복잡성에 따라 많은 노드를 반환 할 수 있습니다. 또한 아이들을 신경 쓰지 않을 때
document.body.querySelectorAll
대신 사용 하는 것을 고려하십시오 .document.querySelectorAll
<head>
답변
같은 것을 찾고 있었다. 음, 정확히는 아닙니다. 모든 DOM 노드를 나열하고 싶었습니다.
var currentNode,
ni = document.createNodeIterator(document.documentElement, NodeFilter.SHOW_ELEMENT);
while(currentNode = ni.nextNode()) {
console.log(currentNode.nodeName);
}
특정 클래스의 요소를 얻으려면 필터 기능을 사용할 수 있습니다.
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);
}
MDN 에서 솔루션을 찾았습니다.
답변
항상 가장 좋은 해결책은 재귀를 사용하는 것입니다.
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]);
}
}
}
다른 제안과 달리이 솔루션은 모든 노드에 대해 배열을 만들 필요가 없으므로 메모리에 더 많은 빛이 들어옵니다. 더 중요한 것은 더 많은 결과를 찾는다는 것입니다. 그 결과가 무엇인지 잘 모르겠지만 크롬에서 테스트 할 때에 비해 약 50 % 더 많은 노드가 발견됩니다.document.getElementsByTagName("*");
답변
다음은 문서 또는 요소를 반복하는 방법에 대한 또 다른 예입니다.
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;
}
답변
Jquery를 사용하는 사람들을 위해
$("*").each(function(i,e){console.log(i+' '+e)});
답변
Andy E.가 좋은 대답을했습니다.
특정 선택기에서 모든 자식을 선택하려는 경우 (최근에이 작업이 필요함) 원하는 DOM 개체에 “getElementsByTagName ()”메서드를 적용 할 수 있습니다.
예를 들어, 웹 페이지의 “시각적”부분을 구문 분석해야했기 때문에
var visualDomElts = document.body.getElementsByTagName('*');
이것은 머리 부분을 고려하지 않습니다.
답변
이 링크에서
자바 스크립트 참조
<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
}