当 querySelectorAll 在不使用库的情况下不可用时,按属性获取元素?

IT技术 javascript dom
2021-01-23 14:24:01
<p data-foo="bar">

你怎么能做相当于

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

其中querySelectorAll不可用

我需要一个至少适用于 IE7 的本机解决方案。我不在乎 IE6。

6个回答

您可以编写一个运行 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');
为什么不使用hasAttribute而不是getAttribute() !== null,因为您只想检查是否存在而不是其值?
2021-03-18 14:24:01
使用!= null是理想的方式(优于上面我的意见),因为在旧版IE有可能的getAttribute返回其值typeof'number'
2021-04-07 14:24:01
为什么使用document.getElementsByTagName('*')而不是document.all
2021-04-09 14:24:01

利用

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

或者

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

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

所有赞成的原因,以及我做出回答的原因,是这个 SO 问题真的很老,所以当你搜索如何找到 DOM 元素时,你会发现这个问题在搜索结果中非常高,而且因为它是人们正在寻找他们赞成。实用性 > 历史准确性。其次,链接仍然可以正常工作,只是 caniuse.com 隐藏了旧浏览器,如果您切换到“使用相关”,您仍然会看到旧浏览器。
2021-03-20 14:24:01
当问题明确要求:“我需要一个至少在 IE7中工作本机解决方案”时,这怎么会有这么多的赞成票其次,该链接指出支持从 IE11 开始,即使它实际上是从 IE8 开始的——也许这应该交换到developer.mozilla.org/en-US/docs/Web/API/Element/...所以它实际上支持答案。 ..?
2021-03-24 14:24:01
完美地工作。快速简单
2021-04-05 14:24:01

我玩了一会儿,最终得到了这个粗略的解决方案:

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 :(
2021-04-09 14:24:01

试试这个它有效

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

例子 :

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

这也有效:

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

所以:

document.querySelector([data-foo="bar"]);
这在实际的 querySelector 中缺少单引号。应该: document.querySelector('[data-foo="bar"]');
2021-04-06 14:24:01