jQuery.closest() 实现的 DOM / 纯 JavaScript 解决方案?

2024-06-25

这是我试图查询的标记。因此给出标记:

<table class="non-unique-identifier table">
<tr><td><div id="unique-identifier"></div></td></tr>
</table>

我正在查询#unique-identifier:

var myDiv = document.getElementById('#unique-identifier');

然后我尝试选择表格。问题是我想让代码不脆弱,所以我不需要这样做:

var myDiv = document.getElementById('#unique-identifier'),
    myTable = myDiv.parentNode.parentNode.parentNode.parentNode;

我的问题

目前是否有相当于 $().closest() 的 DOM 实现?首选最接近且高效且无需嵌套 for 循环的实现。

局限性

我被要求不使用 jQuery 或 sizzle 来解决这个特定问题或引入任何新的库。该代码也很旧。因此,这就是这种限制和存在的原因<tables>.


如果没有循环,你就无法做到这一点:

function closest (el, predicate) {
  do if (predicate(el)) return el;
  while (el = el && el.parentNode);
}

好吧,实际上你可以使用递归(伪装的循环):

function closest(el, predicate) {
  return predicate(el) ? el : (
     el && closest(el.parentNode, predicate)
  );
}

演示(使用Sizzle https://sizzlejs.com/对于 DOM 查询):

// s = selectors
// n = number of selectors
// get closest s[i+1] from s[i]
// where 0 <= i < n and i % 2 = 0

function main (s) {
  var i, el, from;
  var n = s.length;
  for (i = 0; i < n; i += 2) {
    from = Sizzle(s[i])[0];
    el = closest(from, function (el) {
      return !!el && el !== document && (
        Sizzle.matchesSelector(el, s[i + 1])
      );
    });
    console.log(el);
  }
}

function closest (el, predicate) {
  do if (predicate(el)) return el;
  while (el = el && el.parentNode);
}

main([
  "#winner" , "b", 
  "#winner" , "p", 
  "#winner" , "div", 
  "#winner" , "div:not(#trump)", 
  "#winner" , "#clinton",
  "#looser" , "html"
]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/sizzle/1.10.18/sizzle.min.js"></script>

<div id="main">
  <div id="trump">
    <p>Donald <b id="winner">Trump</b></p>
  </div>
  <div id="clinton">
    <p>Hillary <b>Clinton</b></p>
  </div>
</div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jQuery.closest() 实现的 DOM / 纯 JavaScript 解决方案? 的相关文章

  • Angular 2 TypeError:无法读取 null 的属性“animate”

    我正在使用 Chrome 51 和 Angular 2 rc4 并在加载我的 Angular 应用程序时在控制台中弹出以下错误 TypeError Cannot read property animate of null at e supp
  • 各种 Javascript 优化项目如何影响 DOM 性能?

    通过 Tracemonkey Squirrelfish 和 V8 项目 大量 C S 计算机科学融入了 Javascript 这些项目 或其他项目 是否解决了 DOM 操作的性能问题 或者它们纯粹与 Javascript 计算相关 纯 DO
  • 可以跨 iframe 共享 javascript 导入吗?

    我有一个 Web 应用程序 其中有多个 iframe 它们都需要导入相同的 javascript 库 例如 jquery 有没有办法只加载一次并以某种方式在所有 iframe 之间共享该数据 我不想让我的页面加载缓慢 因为它为每个 ifra
  • 用玩笑模拟高阶组件

    我想确保 HOC 组件被开玩笑地调用 但我似乎无法理解jest mock上班 我的 HOC 是这样的 const withEntity args gt const wrappedComponent WrappedComponent gt c
  • 如何使用 html 标签包装 window.getSelection().getRangeAt(0) 中的文本选择?

    如何从 window getSelection getRangeAt 0 中进行选择并用 HTML 标签 例如 span 或 mark 包围它 我更喜欢直接的 javascript 或 jQuery 解决方案 我可以使用警报输出选定的文本
  • 如何在react中返回点击元素的属性?

    我想知道是否有一种简单的方法来获取单击元素的属性React js function App return
  • 获取访客的 Optimizely A/B 测试和变化

    当我在网站上运行实验时 我希望能够找出当前访问者看到的测试和变体 我无法找到如何做到这一点优化Javascript API https www optimizely com docs api 您可以获得第一个正在运行的实验的 ID 假设您有
  • 有效 JSON 上的 Firefox JSON“格式不正确”错误

    我在 Firefox 中收到以下错误消息 Error not well formed Source File http school courses booking add php 1287657494723 Line 1 Column 1
  • 将值传递给映射函数 - CouchDB

    我想知道是否可以将值传递给 couchDB 设计文档中的映射函数 例如 在下面的代码中 可以传递用户输入的值并使用该值来运行地图函数 也许我可以传递用户UserName当他们登录时 然后根据地图功能显示视图 function doc if
  • 通过标记或JS强制下载

    假设我在 CDN 来自 Rackspace 的云文件 上有一个文件 以及一个包含该文件链接的静态 html 页面 有什么方法可以强制下载此文件 以防止它在浏览器中打开 例如 mp3 我们可以让我们的服务器读取该文件并将相应的标头设置为 he
  • 设置三个输入数字的最大值

    我有三个输入数字
  • 发送带有图像的嵌套 JSON

    我一直在尝试研究一种能够通过 Ajax 将嵌套 JSON 请求发送回服务器的方法 根据我的理解 我们主要用于向服务器发送图像或文件的 formdata 在这种情况下不起作用 因为 FormData 似乎不处理嵌套对象 这就是我需要发送的有效
  • jQuery onclick 隐藏其父元素[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想隐藏 li tag on a 使
  • 如何在传单地图上显示热图

    我想在我的传单地图上显示热图 我使用了 heatmap jshttps github com pa7 heatmap js https github com pa7 heatmap js但它最终只是显示 未捕获的类型错误 无法分配给只读属性
  • 如何转义 onClick 处理程序内 JavaScript 代码中的字符串?

    也许我只是想得太难了 但我在弄清楚链接的 onClick 处理程序内的某些 JavaScript 代码中的字符串上使用什么转义时遇到了问题 例子 a href Select a The and 是发生模板替换的地方 我的问题是项目名称可以包
  • 从组件刷新/重新加载 ember 路由

    我有一个组件 它实际上是一个模式对话框 当我完成该对话框并按 确定 按钮时 我想留在打开该对话框的停留页面上 这并不难 但问题是该对话框更改了数据 我通过 REST 调用获取数据 因此我需要刷新已经所在的路线以反映数据更改 因为我是从组件中
  • Google Maps API - 调整大小会生成空白区域

    我正在研究一个看起来非常简单的功能 但却引起了一些头痛 我使用 GIS 并将其与 Google 地图集成 其中一位客户要求能够打开一个仅显示地图的单独弹出窗口 打开窗口不是问题 但当我尝试扩展包含地图的 IFrame 的宽度时 为了适应窗口
  • 多个引导模式的滚动问题

    我有一个带有大量信息的模态页面 因此您需要滚动 该模式包含指向第二个模式的链接 When I 打开模态 1 单击链接打开模式 2 模式 1 保持在后台 然后关闭模式 2 以便我回到模式 1 modal 1 失去滚动 仍然有一个滚动条 但它不
  • 如何使用 jQuery 解析 JavaScript 对象

    jQuery JavaScript 中用于解析 JSON 对象并返回键 值对的 foreach 等效项是什么 JSON 对象 是什么意思 JSON 是一种用于序列化对象的文本格式 如果要循环访问通过反序列化 JSON 字符串获得的对象中的属
  • ASP.NET MVC3 Ajax.ActionLink - 条件确认对话框

    我有一个 Ajax ActionLink 仅当满足某些条件 用户有未保存的更改 时 我才希望显示一个确认对话框 我创建了一个 JavaScript 函数 它根据需要显示确认对话框 并根据响应返回 true 或 false 我将其绑定到 Ac

随机推荐

  • iOS7 色调颜色仅在呈现并关闭另一个 ViewController 后才起作用

    我在 iOS7 中遇到了一个非常奇怪的色调问题 当我第一次加载时遇到问题的 ViewController 时 所有色调都是浅灰色 就好像一切都处于非活动状态或位于使屏幕变暗的 UIAlertView 后面 这些按钮仍然处于活动状态并且工作正
  • C# - 将 WPF Image.source 转换为 System.Drawing.Bitmap

    我发现很多人都在转换BitmapSource to a Bitmap 但是关于ImageSource to Bitmap 我正在制作一个成像程序 我需要从显示的图像中提取位图Image元素 有谁知道如何做到这一点 EDIT 1 这是一个用于
  • Django:设置为 30 秒后过期的 Cookie 实际上会在 30 分钟后过期?

    这是我的代码 def update session request if not request is ajax or not request method POST return HttpResponseNotAllowed POST u
  • 使用 sed 更改 /etc/fstab

    我想改 etc fstab在脚本内 我想添加acl属性到根分区 One fstab行条目如下所示 UUID 730aee20 52b7 4920 75cd d0d995ef2445 ext3 errors remount ro 0 1 我想
  • Paypal IPN 并行支付问题

    我正在用这个http www binpress com app paypal adaptive payments pro codeigniter library 140 http www binpress com app paypal ad
  • 如何修改Open Shift中的节点启动命令?

    我使用 ES6 和 babel node 来创建我的应用程序 并且我要求我的应用程序以命令启动babel node app js 此命令列在我的 package json 中的 script start 中 因此命令 npm start 运
  • 在 R heatmap.2 中移动颜色键(gplots 包的功能)

    我现在阅读了 heatmap 2 帮助手册几次 并且在各种在线教程中我也没有读到有关将颜色键移动到不同位置的方法 现在 我想知道这是否可能 如果您使用 gplots 包中的 heatmap 2 函数 则默认情况下颜色键位于左上角 中每个元素
  • 使用两个不同颜色的数据集创建 matplotlib 热图

    我目前有两个大数据集 我想对它们进行比较 我把它们分开 一个是红色的 一个是蓝色的 但是我想并排显示红色和蓝色 我该怎么办 我当前的代码是 column labels list heatmap ylabels row labels list
  • 在 NHibernate 中标准化 EnumStringType

    我目前正在 NHibernate 中使用枚举 映射如下 public enum UploadMethod Java Silverlight Gears Flash class UploadMethodType EnumStringType
  • 如何在使用代理服务器访问 Internet 的 Windows 计算机上安装 Rails?

    我是 ruby 方式的忠实粉丝 然而今天它妨碍了我 安装rails的事实上的方法 我在WinXP机器上以域用户身份运行 是 下载并安装 ruby 一键安装程序 type gt gem install rails在命令提示符下 步骤 2 失败
  • Vue CLI 3 不会将供应商转换为 ES5

    我们有一个 vue cli 3 项目 它工作得很好并且编译没有问题 事实上 我们必须支持仅支持 ES5 代码的旧浏览器 在项目中我们集成了一些用ES6编写的外部库 reconnecting websocket是一个例子 Problem 使用
  • 如何包装 Python 迭代器以使其线程安全?

    因为有时它比围绕队列设计解决方案更实用 所以我想编写一个简单的包装器来使迭代器线程安全 到目前为止 我的灵感来自these https stackoverflow com questions 1131430 are generators t
  • 使用 gem 添加辅助方法

    我找到了很多有关添加表单辅助方法的信息 请参阅我的其他问题之一 但我找不到有关添加辅助方法的任何信息 就好像它们是在application helper rb 我尝试过复制application helper rb从 Rails 应用程序到
  • 如何获取正在执行的jade脚本的文件名

    是否存在可以从具有各种参数的玉模板中访问的全局对象 是否有一个全局变量包含当前正在执行的jade文件的路径 5 html head title Test body I want to be able to know what the cur
  • Friendly_id 和真实ID

    有什么办法可以得到真正的id使用Friendly id 修改的模型中的列 出于性能原因 我不想对其进行另一个数据库查询 广义上来说Friendly id修改to param and find方法 接下来应该可以工作 affiche Affi
  • OpenCV argc 和 argv 混淆

    我正在检查一些 OpenCV 教程 并在开头找到了这一行 这是链接 代码位于 CalcHist 部分下http opencv willowgarage com documentation c histograms html http ope
  • beautifulsoup find_all 错误?

    现在我正在使用 beautiful soup 来解析 html 页面 但有时我通过find all得到的结果小于页数 例如这个页面有 18 个标题跨度 但是当我使用以下代码时 它只有两个 谁能告诉我为什么 先感谢您 soup Beautif
  • 如何使用 vue-google-charts 创建组织结构图

    按照使用 vue google charts 插件的说明进行操作 https www npmjs com package vue google charts https www npmjs com package vue google ch
  • com.jcraft.jsch.JSchException:算法协商失败

    我正在尝试从客户端计算机连接 sftp 服务器 但是 com jcraft jsch JSchException 算法协商失败 我收到这种错误 com jcraft jsch JSchException Algorithm negotiat
  • jQuery.closest() 实现的 DOM / 纯 JavaScript 解决方案?

    这是我试图查询的标记 因此给出标记 table class non unique identifier table tr td div div td tr table 我正在查询 unique identifier var myDiv do