检测节点何时被删除(或因为父节点被删除而从 DOM 中删除)

2024-01-23

我想检测节点(例如nodeX)何时不再可用,要么是因为它被删除了,要么是因为它的父节点(或其父节点)被删除了。

到目前为止,我能想到的就是使用Mutation Observer来查看页面上的任何删除,并检查删除的节点是否是nodeX或有nodeX作为后代。

有更容易的方法吗?


请注意:据我了解,链接的问题(该问题“是重复的”)询问“如何检测节点的[直接]删除”。我的问题是“如何检测节点或其父节点(或任何其他祖先)的删除”。

据我了解,这对于突变观察者来说并不简单:您需要检查每个删除的节点以查看它是否是祖先。

这是我想要确认或否认的。

据我了解,这与链接的问题不同。


这是一个标识如何删除元素的实现(直接或因为父母被移除)

var target = document.querySelector('#to-be-removed');

var observer = new MutationObserver(function(mutations) {
  // check for removed target
  mutations.forEach(function(mutation) {
    var nodes = Array.from(mutation.removedNodes);
    var directMatch = nodes.indexOf(target) > -1
    var parentMatch = nodes.some(parent => parent.contains(target));
    if (directMatch) {
      console.log('node', target, 'was directly removed!');
    } else if (parentMatch) {
      console.log('node', target, 'was removed through a removed parent!');
    }

  });
});

var config = {
  subtree: true,
  childList: true
};
observer.observe(document.body, config);


var qs = document.querySelector.bind(document);
qs('#ul').addEventListener('click', function(){qs('ul').remove();}, false)
qs('#li').addEventListener('click', function(){qs('#to-be-removed').remove();}, false)
<ul>
  <li>list item 1</li>
  <li>list item 2</li>
  <li id="to-be-removed">list item 3</li>
  <li>list item 4</li>
</ul>

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

检测节点何时被删除(或因为父节点被删除而从 DOM 中删除) 的相关文章

随机推荐

  • Django 外键值的精确匹配

    class Sentence Model name CharField class Tokens Model token CharField sentence ForeignKey Sentence related name tokens
  • 如何在 android 中模拟 Kotlin 对象?

    我在 kotlin 中有一个对象控制当前用户的会话信息 我想模拟有回调的登录方法 在测试时 我需要在 SessionController 对象中模拟此方法 object SessionController fun signIn userna
  • Java (J2SE) DTMF 音调检测

    我正在尝试执行以下操作 我正在使用我的 java 应用程序给另一个人打电话 已经完成并且工作正常 然后我正在播放录音 例如 请按 1 一继续英语 已经完成且工作正常 现在我想检测那个人按 1 根据我在 google 搜索中的研究 我发现这可
  • 如何在 Excel 中将 hhmmAM/PM(无空格)格式化为时间 hh:mm AM/PM?

    我正在开发一个薪资项目 为了提高数据输入效率 我希望以 hhmmAM PM 格式输入时间 没有空格或冒号 最好只输入 a p 而不是 AM PM 并将其转换为标准带有冒号和空格的时间格式 谢谢 这是一个为列编码的小宏A 可以对其进行修改以处
  • 增加火花任务大小[重复]

    这个问题在这里已经有答案了 当我在 Spark Shell 中执行代码时遇到问题 Stage 1 gt 0 0 16 17 01 13 06 09 24 WARN TaskSetManager Stage 1 contains a task
  • 如何处理“超出最大存储过程、函数、触发器或视图嵌套级别(限制 32)”。

    我被要求创建脚本 希望运行它的人提供员工 ID 找到所提供的员工任意深度监督的所有员工 我的代码是 CREATE FUNCTION dbo GetNames V uniqueidentifier RETURNS OldNames TABLE
  • 为什么 R 的重复数据在排序数据上表现更好?

    在比较答案中两个函数的效率时检查列表是否包含 R 中的另一个列表 https stackoverflow com a 39350733 4408538 我偶然发现了一个有趣的结果 排序大大提高了效率duplicated当向量很大时 这让我感
  • 在 PropertyGrid 中设置只读属性将所有属性设置为只读

    我正在使用一个PropertyGrid控件来编辑我的类属性 并且我尝试根据其他属性设置将某些属性设置为只读 这是我班级的代码 Imports System ComponentModel Imports System Reflection P
  • Redis 和 Node.js 以及 Socket.io 问题

    我刚刚学习 redis 和 node js 有两个问题我找不到任何令人满意的答案 我的第一个问题是关于在 Node js 中重用 Redis 客户端 我找到了这个问题和答案 如何在socket io中重用redis连接 https stac
  • 比较两个数组并找出差异

    我需要比较两个数组并获得差异 背景 第一个数组将列出文件夹中的文件 第二个数组将读取文件的内容并存储在数组中 第一个数组的输出将是 a b c d e 第二个数组的输出将是 a b c e 我如何比较这两个有差异的数组 我想要的最终输出是
  • java数组循环遍历

    我有一个包含 1 2 3 4 5 值的数组 array a 1 2 3 4 5 现在我想以循环方式遍历它 就像我想打印 2 3 4 5 1 或 3 4 5 1 2 或 5 1 2 3 4 等等 任何算法关于这个 Edit 我想以循环方式打印
  • 后台服务科尔多瓦离子应用程序。 Backgroudn 插件无法在 ios 8.3 上运行

    我想实现一个后台服务 将地理位置发送到服务器 因此我使用了插件 cordova plugin background modehttps github com katzer cordova plugin background mode htt
  • asyncio - 重新引发任务异常

    我正在使用 asyncio 进行一些 TCP 通信 我有一个Receive 函数的作用是read 无限循环中 这作为后台任务运行 使用asyncio create task Receive 现在 如果连接被对等方关闭 则会引发异常 或者可能
  • 增强数据结构而不浪费内存

    我有课Tree我想将其扩充为更专业的数据结构 例如Order tree and Interval tree 这些增强功能需要添加Node 例如大小信息 以及对某些算法的微小更改 我想知道在 C 中实现性能 可读性和可维护性方面的增强的最佳方
  • Quickbooks API - 如何使用存储的信用卡创建费用

    我想知道如何使用存储的信用卡创建费用 使用 card api 我已成功将卡存储在 QuickBooks Online 中并收到返回的卡 ID 现在我想对存储的卡进行收费 为了创建费用 我发现有两种提供卡详细信息的方法 提供明确的卡详细信息
  • 变换路径和重绘不起作用

    我有一次创建的路径 并向其中添加了 React 在某些情况下 我将路径偏移Path offset or Path transform 然后使我的画布无效以重新绘制路径 但路径并没有在新的地方重新绘制 我通过使用检查了路径边界Path com
  • 如何在通过curl触发构建时设置Jenkins构建描述?

    我正在尝试设置我正在触发的构建的构建描述 因为我正在启动构建 但到目前为止我还没有运气 我遇到了一个解决方案 将文本添加到 Jenkins 远程 API 触发的构建页面 https stackoverflow com questions 1
  • 在 Linq Select 中创建元组

    我正在使用 C 和 NET Framework 4 5 1 使用 Entity Framework 6 1 3 从 SQL Server 数据库检索数据 我有这个 codes codesRepo SearchFor predicate Se
  • 使用 ParamArray,但需要至少一个参数

    我曾经拥有的 Public Sub Subscribe channel As ChannelType Public Sub Subscribe channels As IEnumerable Of ChannelType 第一个只是调用第二
  • 检测节点何时被删除(或因为父节点被删除而从 DOM 中删除)

    我想检测节点 例如nodeX 何时不再可用 要么是因为它被删除了 要么是因为它的父节点 或其父节点 被删除了 到目前为止 我能想到的就是使用Mutation Observer来查看页面上的任何删除 并检查删除的节点是否是nodeX或有nod