【问题标题】:What is the pure JavaScript equivalent of jQuery's .parents() method? [duplicate]jQuery 的 .parents() 方法的纯 JavaScript 等价物是什么? [复制]
【发布时间】:2016-07-19 22:57:04
【问题描述】:

对于此类问题,我深表歉意,但我在 You Might Not Need jQuery 或网上其他任何地方都找不到答案,我真的很想知道:

jQuery 的 .parents() 方法的纯 JavaScript 等价物是什么?

例如,如果知道如何在纯 JavaScript 中做到这一点,那就太好了:

jQuery(element).parents('.className');

【问题讨论】:

  • “jQuery 的 .parents() 方法的纯 JavaScript 等价物是什么?” 没有。你的意思是“jQuery 的 parents() 方法的 DOM API 版本是什么?”
  • while ((element = element.parentElement)) { if (element.matches('.className')) { result.push(element) } }
  • 我很确定这是重复的,但我找不到。
  • 您可以随时查看 jQuery 的 github 以获取其来源:.parents() -> dir()
  • 啊,是的 this 就是我要找的东西

标签: javascript jquery code-translation


【解决方案1】:

DOM API 中没有一个函数/属性等同于 jQuery 的parents()。有parentNode 属性(和Oriol points out 一样,parentElement 属性会阻止你从document.documentElementdocument),它是上元素的父节点(或父元素)您可以访问它,或者 null 如果它没有。要大致匹配 jQuery 的 parents(),您可以在其上循环(例如,获取 parentNode/parentElementparentNode/parentElement 等)以查找所有父母。作为squint notes,在每个级别的模糊现代浏览器上,您可以使用matches 来检查父级是否匹配选择器(当您将选择器传递给parents() 时,将jQuery 的行为与parents() 匹配)。

jQuery 对 DOM 操作和遍历采用基于集合的方法,而 DOM API 采用每个元素/节点的方法。

例子:

var elm = document.getElementById("target");
var parents = getParents(elm);
console.log(Array.prototype.map.call(
  parents,
  function(e) {
    return e.nodeName + (e.id ? "#" + e.id : "");
  }
).join(", "));
function getParents(e) {
  var result = [];
  for (var p = e && e.parentElement; p; p = p.parentElement) {
    result.push(p);
  }
  return result;
}
<div id="outermost">
  <div id="middle">
    <div id="inner">
      <div id="target"></div>
    </div>
  </div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

【讨论】:

  • 使用parentElement而不是parentNode来避免document
  • @Oriol:这需要比 matches/matchesSelector 更现代的浏览器
  • @Bergi 也许,如果您考虑带有供应商前缀的非标准名称。 parentElement 不需要,并且比 matches 有更多的支持。
  • @Oriol:哎呀,对,我将matchesSelectormatches 支持混合在一起。
【解决方案2】:

Node.parentNode

当您通过某种方法(document.getElementById()document.querySelector() 等)获取 HTML 时,它将返回一个 Node 对象,该对象的 .parentNode 属性是父 Node 对象


获取所有父节点,类似于 jQuery 的.parents():

我不久前写了这个函数:

function parents(node) {
   let current = node,
       list    = [];
   while(current.parentNode != null && current.parentNode != document.documentElement) {
     list.push(current.parentNode);
     current = current.parentNode;
   }
    return list
}

请注意,这只是经过轻微测试,因此请谨慎使用

【讨论】:

  • 并不是一回事,尽管您可以使用 .parentNode 属性递归地向后遍历 DOM 以实现与 jQuery .parents() 方法类似的功能。但这需要编写一些代码。
  • 不过,我当然不会因此而投反对票。
  • @T.J.Crowder 同意。将反对票反转为严厉:-)
  • 使用parentElement就不需要检查!= document
  • 我最初是递归写的,而不是让它循环
猜你喜欢
  • 2020-05-01
  • 2011-12-26
  • 2013-10-13
  • 2015-09-21
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
相关资源
最近更新 更多