JavaScript 만 사용하면 특정 data-
속성 을 가진 모든 DOM 요소를 선택하는 가장 효율적인 방법은 무엇입니까 data-foo
? 요소는 다른 태그 요소 일 수 있습니다.
<p data-foo="0"></p><br/><h6 data-foo="1"></h6>
data-
: 요소, 즉 data-foo=0
와 data-bar=1
와 data-app="js"
와 data-date="20181231"
JavaScript 만 사용하면 특정 data-
속성 을 가진 모든 DOM 요소를 선택하는 가장 효율적인 방법은 무엇입니까 data-foo
? 요소는 다른 태그 요소 일 수 있습니다.
<p data-foo="0"></p><br/><h6 data-foo="1"></h6>
data-
: 요소, 즉 data-foo=0
와 data-bar=1
와 data-app="js"
와 data-date="20181231"
답변:
querySelectorAll 을 사용할 수 있습니다 .
document.querySelectorAll('[data-foo]');
document.querySelectorAll("[data-foo]")
해당 속성을 가진 모든 요소를 가져옵니다.
document.querySelectorAll("[data-foo='1']")
값이 1 인 사람 만 얻을 수 있습니다.
.querySelectorAll()
반환합니다 NodeList
. 해당 문서에서 언급했듯이을 사용하여 컬렉션을 반복 할 수 있습니다 .forEach()
. 이것은 비 IE 솔루션입니다 ( developer.mozilla.org/en-US/docs/Web/API/…) . IE를 지원해야하는 경우 일반 for
루프를 사용하여 NodeList를 반복해야합니다.
<!DOCTYPE html>
<html>
<head></head>
<body>
<p data-foo="0"></p>
<h6 data-foo="1"></h6>
<script>
var a = document.querySelectorAll('[data-foo]');
for (var i in a) if (a.hasOwnProperty(i)) {
alert(a[i].getAttribute('data-foo'));
}
</script>
</body>
</html>
for in
하면 길이 및 항목 속성이 반복됩니다. 대신 for of
에 반복되도록 설계된 속성을 반복하여 사용하십시오.
흥미로운 해결책은 다음과 같습니다 . 브라우저 CSS 엔진을 사용하여 선택기와 일치하는 요소에 더미 속성을 추가 한 다음 계산 된 스타일을 평가하여 일치하는 요소를 찾습니다.
그것은 스타일 규칙을 동적으로 생성한다. [...] 그런 다음 전체 문서를 스캔하고 (많은 속이고 IE 고유하지만 매우 빠른 document.all을 사용하여) 각 요소에 대해 계산 된 스타일을 얻는다. 그런 다음 결과 객체에서 foo 속성을 찾아 "bar"로 평가되는지 확인합니다. 일치하는 각 요소에 대해 배열에 추가합니다.
var matches = new Array();
var allDom = document.getElementsByTagName("*");
for(var i =0; i < allDom.length; i++){
var d = allDom[i];
if(d["data-foo"] !== undefined) {
matches.push(d);
}
}
누가 -1로 나를 괴롭 혔는지 확실하지 않지만 여기에 증거가 있습니다.
getElementsByTagName
에서는 전역 ( *
) 선택기가 손상되었습니다. 재귀 DOM 검색이 작업을 수행하는 곳입니다. 속성에서 매핑 된 ElementNode에는 "data-foo"속성도 없습니다 data-foo
. dataset
객체를 찾고 있습니다 (예 : node.dataset.foo
.
querySelectorAll
(문제가 거의 없음) 예쁘지 않지만 DOM을 반복하고 대부분의 브라우저 (이전 및 새 브라우저)에서 작동 해야하는 매우 유연한 기능이 있습니다. 브라우저가 조건 (예 : 데이터 속성)을 지원하는 한 요소를 검색 할 수 있어야합니다.
궁금한 점은 : jsPerf에서이 QSA를 테스트하지 않아도됩니다. Opera 11과 같은 브라우저는 쿼리를 캐시하고 결과를 왜곡합니다.
암호:
function recurseDOM(start, whitelist)
{
/*
* @start: Node - Specifies point of entry for recursion
* @whitelist: Object - Specifies permitted nodeTypes to collect
*/
var i = 0,
startIsNode = !!start && !!start.nodeType,
startHasChildNodes = !!start.childNodes && !!start.childNodes.length,
nodes, node, nodeHasChildNodes;
if(startIsNode && startHasChildNodes)
{
nodes = start.childNodes;
for(i;i<nodes.length;i++)
{
node = nodes[i];
nodeHasChildNodes = !!node.childNodes && !!node.childNodes.length;
if(!whitelist || whitelist[node.nodeType])
{
//condition here
if(!!node.dataset && !!node.dataset.foo)
{
//handle results here
}
if(nodeHasChildNodes)
{
recurseDOM(node, whitelist);
}
}
node = null;
nodeHasChildNodes = null;
}
}
}
그런 다음 다음을 사용하여 시작할 수 있습니다.
recurseDOM(document.body, {"1": 1});
속도 또는 recurseDOM(document.body);
사양이 포함 된 예 : http://jsbin.com/unajot/1/edit
사양이 다른 예 : http://jsbin.com/unajot/2/edit
querySelectorAll
있습니까?
querySelectorAll
API 로 완전히 오버 코딩되고 불필요합니다
document.querySelectorAll
IE7에서 작동하지 않습니다. DOM 트리를 걷고 각 태그의 속성을 검사 하는 폴백 스크립트를 작성해야합니다 (실제로는 속도querySelectorAll
가 빠르지 않고 수동으로 태그를 검사해야 함).