라이브러리를 사용하지 않고 querySelectorAll을 사용할 수없는 경우 속성별로 요소를 가져 오나요?


123
<p data-foo="bar">

당신은 어떻게 동등한 것을 할 수 있습니까?

document.querySelectorAll('[data-foo]')

querySelectorAll을 사용할 수없는 곳 은 어디 입니까?

최소한 IE7에서 작동하는 기본 솔루션이 필요합니다. IE6는 신경 쓰지 않습니다.


아웃 확인 sizzle.js 자바 스크립트 선택 라이브러리
시대

1
내가 할 필요가있는 유일한 선택은 데이터 속성이므로 Sizzle과 같은 전체 선택기 엔진을 가져 오지 않고이를 패치하는 가장 간단한 방법을 알아 내려고했습니다. 그러나 소스를 살펴 보는 것이 좋습니다. BTW 또 다른 좋은 선택 엔진입니다 github.com/ded/qwery
ryanve은

@ryanve, 감사합니다 내가 살펴볼 것입니다 :)
epoch

내가 사용하는 작업 솔루션에 github.com/ryanve/dope/blob/master/dope.js 'queryAttr'라는 방법
ryanve

7
Lol, 귀하의 질문은 내 대답입니다. 그래서 이것은 또 다른 질문이 있습니다. 어떤 상황에서 querySelectorAll사용할 수 없습니까? note - I don't care all IE
vzhen

답변:


136

getElementsByTagName ( '*')을 실행하고 "data-foo"속성이있는 요소 만 반환하는 함수를 작성할 수 있습니다.

function getAllElementsWithAttribute(attribute)
{
  var matchingElements = [];
  var allElements = document.getElementsByTagName('*');
  for (var i = 0, n = allElements.length; i < n; i++)
  {
    if (allElements[i].getAttribute(attribute) !== null)
    {
      // Element exists with attribute. Add to array.
      matchingElements.push(allElements[i]);
    }
  }
  return matchingElements;
}

그때,

getAllElementsWithAttribute('data-foo');

8
사용 != null이상적인 방법입니다 (더 이상 내 댓글 제외)의 getAttribute는 그 값을 반환 할 오래된 IE에서 가능하기 때문 typeof이다'number'
ryanve

1
document.getElementsByTagName('*')대신 왜 사용 document.all합니까?
pedrozath

1
값이 아닌 존재 만 확인하고 싶기 때문에 hasAttribute보다는 대신 사용 하지 않는 이유는 무엇 getAttribute() !== null입니까?
rvighne

61

사용하다

//find first element with "someAttr" attribute
document.querySelector('[someAttr]')

또는

//find all elements with "someAttr" attribute
document.querySelectorAll('[someAttr]') 

속성으로 요소를 찾습니다. 이제 모든 관련 브라우저 (IE8 포함)에서 지원됩니다. http://caniuse.com/#search=queryselector


2
질문 에서 " 최소한 IE7 에서 작동 하는 네이티브 솔루션 이 필요합니다."라는 질문이 명시 적으로 요청 될 때 어떻게 이렇게 많은 찬성 투표가 발생합니까 ? 둘째, 해당 링크는 실제로 IE8에서 시작하더라도 IE11에서 지원이 시작된다는 것을 나타냅니다. 아마도 이것은 developer.mozilla.org/en-US/docs/Web/API/Element/…로 바꿔야 하므로 실제로 대답을 지원합니다. ..?
Zze

7
모든 찬성에 대한 이유와 제가 답변 한 이유는이 SO 질문이 정말 오래 되었기 때문입니다. 따라서 DOM 요소를 찾는 방법을 검색 할 때이 질문이 검색 결과에서 매우 높은 것을 발견 할 수 있습니다. 그들이 upvote를 찾고 있습니다. 유용성> 역사적 정확성. 두 번째로 링크는 여전히 잘 작동합니다. caniuse.com에 이전 브라우저가 숨겨져 있기 때문입니다. "사용 상대"로 전환하면 이전 브라우저가 계속 표시됩니다.
Pylinux

완벽하게 작동했습니다. 빠르고 간단합니다
Dawson B

2020 년입니다. 이것은 지금 받아 들여지는 대답이어야합니다.
NearHuscarl

44

나는 약간 놀았고이 조잡한 해결책으로 끝났습니다.

function getElementsByAttribute(attribute, context) {
  var nodeList = (context || document).getElementsByTagName('*');
  var nodeArray = [];
  var iterator = 0;
  var node = null;

  while (node = nodeList[iterator++]) {
    if (node.hasAttribute(attribute)) nodeArray.push(node);
  }

  return nodeArray;
}

사용법은 매우 간단하며 IE8에서도 작동합니다.

getElementsByAttribute('data-foo');
// or with parentNode
getElementsByAttribute('data-foo', document);

http://fiddle.jshell.net/9xaxf6jr/

하지만 권장 사용 querySelector/ All이것에 대한 (그리고 오래된 브라우저가 사용 지원 polyfill을 ) :

document.querySelectorAll('[data-foo]');

예, querySelectorAll의 경우 +1입니다. 빠른 jsperf 테스트 jsperf.com/custom-vs-selectorall-attributes 불행하게도 그렇지 IE 7 호환 :(이다 ... 그것은 허용 대답보다 훨씬 더 빠른 것을 보여줍니다
세바스티앙 다니엘

11

이것을 시도해보십시오.

document.querySelector ( '[attribute = "value"]')

예 :

document.querySelector('[role="button"]')

5

그것도 작동합니다.

document.querySelector([attribute="value"]);

그래서:

document.querySelector([data-foo="bar"]);

2
실제 querySelector에서 작은 따옴표가 누락되었습니다. 해야합니다 document.querySelector('[data-foo="bar"]');
Brettins

1

이것을 시도하십시오-위의 답변을 약간 변경했습니다.

var getAttributes = function(attribute) {
    var allElements = document.getElementsByTagName('*'),
        allElementsLen = allElements.length,
        curElement,
        i,
        results = [];

    for(i = 0; i < allElementsLen; i += 1) {
        curElement = allElements[i];

        if(curElement.getAttribute(attribute)) {
            results.push(curElement);
        }
    }

    return results;
};

그때,

getAttributes('data-foo');

3
무엇을 변경했으며 그 이유는 무엇입니까?
Artjom B.

1

필요한 경우 값으로 속성 을 가져올 수 있도록 @kevinfahy의 답변 에 대한 약간의 수정 :

function getElementsByAttributeValue(attribute, value){
  var matchingElements = [];
  var allElements = document.getElementsByTagName('*');
  for (var i = 0, n = allElements.length; i < n; i++) {
    if (allElements[i].getAttribute(attribute) !== null) {
      if (!value || allElements[i].getAttribute(attribute) == value)
        matchingElements.push(allElements[i]);
    }
  }
  return matchingElements;
}

0

브라우저에서 사용하지 마십시오

브라우저에서 document.querySelect('[attribute-name]').

그러나 단위 테스트 중이고 mocked dom에 flakey querySelector 구현이 있으면 이것이 트릭을 수행합니다.

이것은 @kevinfahy의 대답이며 ES6 뚱뚱한 화살표 기능을 사용하고 아마도 가독성을 희생하면서 HtmlCollection을 배열로 변환하여 약간 줄였습니다.

따라서 ES6 트랜스 파일러에서만 작동합니다. 또한 많은 요소로 얼마나 성능이 좋을지 모르겠습니다.

function getElementsWithAttribute(attribute) {
  return [].slice.call(document.getElementsByTagName('*'))
    .filter(elem => elem.getAttribute(attribute) !== null);
}

그리고 여기에 특정 값을 가진 속성을 가져 오는 변형이 있습니다.

function getElementsWithAttributeValue(attribute, value) {
  return [].slice.call(document.getElementsByTagName('*'))
    .filter(elem => elem.getAttribute(attribute) === value);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.