不使用库时,如果querySelectorAll不可用,则按属性获取元素?

rya*_*nve 120 javascript dom

<p data-foo="bar">
Run Code Online (Sandbox Code Playgroud)

你怎么能做相同的

document.querySelectorAll('[data-foo]')
Run Code Online (Sandbox Code Playgroud)

其中querySelectorAll不可用

我需要一个至少在IE7中工作的本机解决方案.我不关心IE6.

小智 130

您可以编写一个运行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;
}
Run Code Online (Sandbox Code Playgroud)

然后,

getAllElementsWithAttribute('data-foo');
Run Code Online (Sandbox Code Playgroud)

  • 使用`!= null`是理想的方法(比上面的评论更好),因为在旧的IE中,getAttribute可以返回``typeof`为''number'的值. (8认同)
  • 为什么不使用 `hasAttribute` 而不是 `getAttribute() !== null`,因为你只想检查是否存在而不是它的值? (2认同)

Pyl*_*nux 57

使用

//find first element with "someAttr" attribute
document.querySelector('[someAttr]')
Run Code Online (Sandbox Code Playgroud)

要么

//find all elements with "someAttr" attribute
document.querySelectorAll('[someAttr]') 
Run Code Online (Sandbox Code Playgroud)

按属性查找元素.现在所有相关浏览器(甚至是IE8)都支持它:http://caniuse.com/#search=queryselector

  • 所有upvotes的原因,以及我得出答案的原因,是这个SO问题是__ally_ old,所以当你搜索如何找到DOM元素时,你会在搜索结果中发现这个问题非常高,因为这是人们的意思正在寻找他们upvote.实用性>历史准确性.其次,链接仍然可以正常工作,只是caniuse.com隐藏了旧的浏览器,如果你切换到"使用相对",你仍然会看到旧的浏览器. (6认同)
  • 当问题明确要求:“我需要一个在IE7中运行至少**的**本机解决方案**”时,这怎么会有这么多的反对意见。其次,即使该链接实际上是从IE8开始的,该链接也指出该支持从IE11开始-也许应该将其交换到https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelectorAll,因此实际上支持答案...? (2认同)

yck*_*art 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;
}
Run Code Online (Sandbox Code Playgroud)

用法非常简单,甚至可以在IE8中使用:

getElementsByAttribute('data-foo');
// or with parentNode
getElementsByAttribute('data-foo', document);
Run Code Online (Sandbox Code Playgroud)

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

但我建议使用querySelector/ All为此(并支持旧浏览器使用polyfill):

document.querySelectorAll('[data-foo]');
Run Code Online (Sandbox Code Playgroud)


Bra*_*lGH 9

试试这个有效

document.querySelector( '[属性= "值"]')

例如:

document.querySelector('[role="button"]')
Run Code Online (Sandbox Code Playgroud)


Cal*_*arl 5

这也可行:

document.querySelector([attribute="value"]);
Run Code Online (Sandbox Code Playgroud)

所以:

document.querySelector([data-foo="bar"]);
Run Code Online (Sandbox Code Playgroud)

  • 这在实际的 querySelector 中缺少单引号。应该是:`document.querySelector('[data-foo="bar"]');` (2认同)