19

后备是无关紧要的。请不要图书馆。

我们有一个 dom 对象引用,我们将调用obj. 它实际上是一个 event.target。

我们有一个节点列表,我们将调用nodes它,它是通过 querySelectorAll 和一个变量选择器获得的。

nodes可能有 1 个或多个元素,并且每个元素都可能有子元素。

我们需要确定obj是那些节点元素之一,还是那些节点元素的子元素。我们在这里寻找“本机”浏览器功能,我们可以编写自己的for循环并完成此任务,我们正在寻找替代方案。

就像是:

nodes.contains(obj)或者nodes.indexof(obj)

涉及检索要匹配的节点列表的其他方法的解决方案是可以接受的,但我不知道那些可能是什么。

4

5 回答 5

15

如果 <=IE11 不是问题,那么我认为最干净的是使用Array.from

Array.from(nodes).find(node => node.isEqualNode(nodeToFind));
于 2020-01-25T04:13:20.797 回答
14

我不确定这是否会搜索超出 NodeList 的第一级,但您可以递归地使用此表达式来遍历它并检查元素 'obj' 是否在 NodeList 'nodes' 中。

[].indexOf.call(nodes, obj)
于 2014-10-09T13:19:56.140 回答
7

我做了这样的事情:

Array.prototype.find.call(style.childNodes, function(child) {
  if(child.textContent.includes(drawer.id)) {
    console.log(child);
  }
});

似乎工作。然后 child 是另一个 html 节点,您可以随意操作它。

于 2016-05-10T18:08:24.707 回答
6

我认为没有内置的 DOM 方法。您需要递归遍历您的NodeList, 并检查与您的元素是否相等。另一种选择是Element.querySelectorAll在您的每个第一级元素上使用NodeList(例如,寻找元素的 id)。不过,我不确定(客栈)效率如何。

于 2012-10-19T18:49:49.897 回答
0

除了多米尼克作为函数的回答:

function nodelist_contains (nodelist, obj)
{
  if (-1 < Array.from (nodelist).indexOf (obj))
    return true;
  
  return false;
} 
于 2021-01-07T14:14:10.513 回答