DOMNodeRemovedFromDocument 的简单 MutationObserver 版本

2024-04-17

我将一些功能附加到 DOM 元素,并希望能够在从 DOM 中删除该元素时清除所有引用,以便可以对其进行垃圾收集,

我检测元素删除的初始版本是这样的:

var onremove = function(element, callback) {
    var destroy = function() {
        callback();
        element.removeEventListener('DOMNodeRemovedFromDocument', destroy);
     };
     element.addEventListener('DOMNodeRemovedFromDocument', destroy);
};

然后我读到了突变事件 https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Mutation_events已被弃用,有利于变异观察者 https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver。所以我尝试移植我的代码。这就是我想出的:

 var isDescendant = function(desc, root) {
     return !!desc && (desc === root || isDecendant(desc.parentNode, root));
 };

var onremove = function(element, callback) {
    var observer = new MutationObserver(function(mutations) {
        _.forEach(mutations, function(mutation) {
            _.forEach(mutation.removedNodes, function(removed) {
                if (isDescendant(element, removed)) {
                    callback();

                    // allow garbage collection
                    observer.disconnect();
                    observer = undefined;
                }
            });
        });
    });
    observer.observe(document, {
         childList: true,
         subtree: true
    });
};

这对我来说看起来过于复杂(而且效率不是很高)。我错过了什么还是这真的是应该的工作方式?


实际上......是的,有一个更优雅的解决方案:)。

您添加的内容看起来不错并且似乎经过了很好的优化。然而,有一种更简单的方法可以知道节点是否附加到 DOM。

function onRemove(element, onDetachCallback) {
    const observer = new MutationObserver(function () {
        if (!document.contains(element)) {
            observer.disconnect();
            onDetachCallback();
        }
    })

    observer.observe(document, {
         childList: true,
         subtree: true
    });
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DOMNodeRemovedFromDocument 的简单 MutationObserver 版本 的相关文章

  • 在反应中计算数量和价格总计

    我是 React 的新手 我在尝试设计的应用程序中遇到了问题 基本上我想要一个产品列表 我可以让用户更新其数量 每个数量的总数将显示在产品下方 整个包裹的总数将显示在底部 如果有人可以帮助我 我将非常感激 我的代码包含在下面 import
  • Google 地图 V3:防止标记缩放

    我有一个谷歌地图 上面有一个标记 我需要将标记设置为固定大小 例如 10x10 像素 并且即使放大或缩小也以相同的大小重新发送 这就是我现在所拥有的 并且不起作用 var marker new google maps Marker posi
  • 为什么字符串中的反斜杠(\)在控制台中给出错误

    我有一个像这样的字符串 C projects cisco iwan staging enc enterprise network controller ui plugins iwan 当我粘贴到console然后按回车键 它给出以下错误 U
  • 代理错误:无法将请求 /auth/register 从 localhost:3000 代理到 http://localhost:8800/api/

    注册 jsx import React from react import useState from react import Link from react router dom import axios from axios cons
  • 如何取消js文件的压缩?

    如何取消通过 webpack 工具缩小的 js 文件 缩小之前 function autoslideSlider next slide trigger click window on load function preloader fade
  • Node.js 原生 Promise.all 是并行处理还是顺序处理?

    我想澄清这一点 因为文档 https developer mozilla org en US docs Web JavaScript Reference Global Objects Promise all对此还不是太清楚 Q1 Is Pr
  • 同位素重叠图像?

    似乎它只发生在 Chrome 和 Safari 中 而不是 Firefox 我将它与基础响应框架一起使用 所以我不确定如何设置高度 Chrome Safari 中的图像之间似乎也没有足够的间距 我该如何解决 编辑 这是一个小提琴http j
  • 未捕获(承诺中)语法错误:获取函数中出现意外的标记'

    我有几个结构如下的 JSON 文件 我们称之为 info json data title Job company Company past fulltime Former Company intern Women IT Priority 5
  • 覆盖骨干模型更改事件

    我认为我想做的事情很简单 我只是不知道该怎么做 当我的模型属性之一发生更改以便将一些数据传递给事件处理程序时 无论更改是值的增加还是减少 我想触发我自己的事件 基本上我希望我的处理程序在视图中执行此操作 handler function i
  • div 中的内部 html 更改时触发事件

    I have div对于一些信息 填写为 innerHTML单击按钮 目标是我想要 slideDown添加 div 中的文本时的 div 可以用 jQuery 来实现吗 Example div div 将文本添加到 div document
  • 如何将嵌套的 javascript 对象转换为仅第一级属性对象?

    我有以下对象inputObj我想将其转换为一个简单的对象 例如outputObj var inputObj a 1 b true c string1 d e string2 f false g 5 h i 7 j string3 k nam
  • 如何通过向上移动到地址栏来检测鼠标离开页面?

    我创建了一个 jQuery 事件 当访问者离开页面时会弹出一个对话框 我正在使用 e pageY 来检测鼠标位置 当鼠标位于Y 小于2时 弹出对话框 问题是 当我向下滚动页面并决定离开页面时 弹出窗口不会显示 因为鼠标不在 Y 小于 2 处
  • 获取数组中所有LI元素

    如何让 JS 选择 UL 标签内的每个 LI 元素并将它们放入数组中 div ul li One li li Two li li Three li li Four li li Five li ul div 我可以让 JS 将它们每个放入一个
  • jquery 改变标签

    我的代码不起作用 你能帮我吗 我希望将 class s7 的标签名称 p 更改为 h1 问题是您将所有元素与类相匹配s7 但是您需要对它们进行一一处理 以便将其内容复制到新元素中 在您当前的代码中 this总是document 不是当前元素
  • 在 Javascript 构造函数中引用实例变量

    我试图通过执行以下操作来维护对象的状态 obj function this foo undefined this changeState function function this foo bar This is contrived bu
  • AngularJS 和 Webpack 集成

    我正在寻找一些使用帮助webpack http webpack github io docs 对于大型 AngularJS 应用程序 我们使用基于功能的文件夹结构 每个功能 页面都有一个模块 并且它们有控制器 指令 我已经成功配置了 web
  • 按名称调用作为对象成员的 javascript 函数

    我希望能够通过名称将对任意函数的引用传递给另一个 javascript 函数 如果只是一个全局函数 没有问题 function runFunction funcName window funcName 但假设该函数可以是任意对象的成员 例如
  • AngularJS - 使用 Angular-UI Typeahead 时出现“错误:模板必须只有一个根元素”

    我在用着AngularUI 提前输入 http angular ui github io bootstrap typeahead 在我的应用程序的 索引 页面上 我没有做任何花哨的事情 事实上 我只是想让他们在 UI 网站上发布的示例正常工
  • 如何解析不可预测地散布到字符串中的 JSON?

    假设我有一个 node js 应用程序 它以一种奇怪的格式接收输入 带有任意散布在其中的 JSON 的字符串 如下所示 This is a string with json in it followed by more text and s
  • jQuery 创建多维数组

    我花了很长时间试图弄清楚如何在 jQuery 中创建多维数组 我在循环之外实例化数组 在循环内部我想添加数组元素 i 0 loop start

随机推荐

  • TortoiseHg无法提交--“系统找不到指定的文件”

    我刚刚选择了 TortoiseHg 用于 Windows 上的分布式源代码控制 并将其安装在我的 C 驱动器上 然后我创建了一个存储库 位于 D projects 中 当我尝试提交更改时 它给了我错误 abort None 系统找不到 指定
  • 应用程序未安装在模拟器上:警告:打开音频输入失败

    我创建了一个 你好 项目 我没有更改 eclipse 生成的默认模板的任何内容 然后我运行了该应用程序 我没有收到任何错误 但是 该应用程序并未安装在模拟器上 环境 windows7 x64 jdk 7u7 windows x64 inst
  • 获取ASP.NET网站用户的MAC

    我正在寻找一种解决方案来查找使用 asp net 网站的用户的 MAC 号码 我知道你可以获得一个IP地址 不知道为什么 但它不会很复杂 但是我可以找出具有该IP的MAC地址吗 编辑 我的意思是在 NET中以编程方式 而不是手动 IP 地址
  • Godoc 文档不输出列表

    在整个项目中 我负责测试和记录 为函数和方法创建了文档 格式如下 CheckPermissionArray checks that values is an array that contains the expectedValue Par
  • Android 模拟器无法在 Eclipse 中启动

    我刚刚安装了整个 shebang 以便在 Eclipse 中开发 Android 应用程序 我运行的是 64 位 gentoo 一切似乎都很顺利 我创建了开发组的 hello world 示例 package com nfshost fly
  • 如何调整 svg 的大小(使用蜡染)并显示它?

    我有一个 100x100 像素的 svg 文件 例如 我正在使用蜡染 如果我做一个 JSVGCanvas svg new JSVGCanvas svg setSize 10 10 它只会显示图片的这一部分 而不显示调整大小的图像 你知道如何
  • 如何在 Core Data 中进行 NSManagedObject 的深度复制

    我正在尝试复制核心数据中现有的 NSManagedObject 和相关子对象 我似乎找不到一个简单的方法来做到这一点 我有一个从核心数据数据库填充的 NSArrayController 我想获取 SelectionIndex 处的对象并进行
  • 从 Zend Framework 2 中的路由获取 $_GET 参数

    Zend Framework 1 有一种非常简单的方法来解析 URL 路由并在 GET 超全局中设置找到的参数以便于访问 当然 您可以在控制器内使用 gt getParam something 但如果在 URL 中找到参数 则它是also可
  • 独立脚本可以为绑定到电子表格的另一个脚本创建触发器吗?

    我正在尝试为电子表格绑定脚本创建一个可安装的 onEdit 触发器 我想使用单独的独立脚本以编程方式执行此操作 根据文档看来这应该是可能的 请注意 与简单的 onOpen 触发器不同 可安装触发器的脚本不需要绑定到电子表格 要从独立脚本创建
  • 今天的google doodle世界博览会是如何实现的? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我想知道它
  • Javascript,CSS:将变换原点更改为手势更改的中心点

    我想将变换原点更改为捏合手势的中心点 此工作代码 safariDevSample 应用缩放和旋转而不改变transform origin window angle 0 global to store data for later reset
  • ValidationError:选项对象无效。复制插件已使用与 API 架构不匹配的选项对象进行初始化

    由于存在漏洞 我刚刚更新了 package json 中的一些包 所有漏洞均已修复 但当我执行 npm run 时出现以下错误 复制插件包在我的漏洞修复过程中得到了更新 我尝试从旧提交中复制 package json 并重新安装所有软件包
  • 对 F# 联合类型列表进行操作

    这是我的问题的延续F 联合类型列表 https stackoverflow com questions 13770911 f list of union types 感谢有用的反馈 我能够创建一个列表Reports with Report要
  • waveOutWrite 和 waveOutGetPosition 死锁问题

    我正在开发一个使用连续播放音频的应用程序waveOut API来自winmm dll 该应用程序使用 leapfrog 缓冲区 它基本上是一堆转储到音频队列中的样本数组 Windows 按顺序无缝播放它们 并且当每个缓冲区完成时 Windo
  • 如何在 2.0 和 1.x 之间切换 TensorFlow 版本?

    有没有办法切换tensorflow的版本 当我使用conda安装tensorflow 2 0时 它更新了很多东西 甚至是python 跑步时conda list它显示两个版本 张量流2 0 0 mkl py37h66b46cc 0张量流 1
  • 测试 AWS Elastic Beanstalk 扩展

    我已经在弹性豆茎中设置了一个服务器 需要时 应该将实例数量从 1 增加到最多 4 但是 我有一个潜在的怀疑 当它启动一个新实例时 该实例将无法正确配置 因为我无法安装用于 Python 的 mySQL 模块 无需 ssh 进入实例并手动设置
  • 如何通过反射加载所有 Entity Framework 4.1 实体配置实体?

    In my OnModelCreating我的数据上下文的方法目前正在手动映射所有实体配置映射类 例如 protected override void OnModelCreating DbModelBuilder modelBuilder
  • 将数据批量插入 Oracle 数据库的最佳方法

    我将创建很多数据脚本 例如 INSERT INTO 和 UPDATE 如果不是 1 000 000 条记录 也会有 100 000 条以上记录 快速将这些数据导入 Oracle 的最佳方法是什么 我已经发现 SQL Loader 不适合这样
  • 解析 LDAP dn 的正则表达式

    我有以下字符串 cn abcd cn groups dc domain dc com 这里可以使用正则表达式来提取第一个之后的字符串吗cn 在第一个之前 在上面的例子中 答案应该是abcd cn 大多数语言会将匹配提取为 1 或 match
  • DOMNodeRemovedFromDocument 的简单 MutationObserver 版本

    我将一些功能附加到 DOM 元素 并希望能够在从 DOM 中删除该元素时清除所有引用 以便可以对其进行垃圾收集 我检测元素删除的初始版本是这样的 var onremove function element callback var dest