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

<p data-foo="bar">

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

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

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

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



답변

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');


답변

사용하다

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

또는

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

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


답변

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

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]');


답변

이것을 시도해보십시오.

document.querySelector ( ‘[attribute = “value”]’)

예 :

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


답변

그것도 작동합니다.

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

그래서:

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


답변

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

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');


답변

필요한 경우 값으로 속성 을 가져올 수 있도록 @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;
}