jQuery data() 如何打破循环引用

2023-11-22

我读过一篇为什么它更好 and 它是如何实施的。但我真正不明白的是它如何打破循环引用?.

它如何打破参考圆?

$(div1).data('item', div2);
$(div2).data('item', div1);

例如,上面的div互相指向,如何防止?我有一种预感,但我只是想确定我的预感是否正确。


当您将对 DOM 对象的引用作为该 DOM 对象的属性放在 DOM 对象上时,某些浏览器中会出现循环引用问题。然后,您就有两个互相指向的 DOM 对象。删除带有自定义属性的 DOM 对象并不会清除该自定义属性。不太聪明的垃圾收集器不会意识到这个 DOM 引用不算数,因此它会被卡住,并且有多种方式可能导致泄漏。

.data()解决了这个问题,因为.data()数据不在 DOM 对象上。它只是一个 JavaScript 数据结构,可以通过唯一的字符串 ID 与 DOM 对象关联。

其中一个令人困惑的部分是,当你阅读时.data("key")key在 JavaScript 中找不到.data()数据结构,然后,只有那时,jQuery 才会在 DOM 对象上查找名为"data-key"。但每当你用.data("key", "myData"),它从不写入 DOM 对象,只写入 javascript 数据结构。

因此,自从.data()从不将数据写入 DOM 对象,因此不会出现某些浏览器遇到问题的任何此类循环引用。

还有一些其他有用的事情需要了解.data()数据结构。当你使用 jQuery 时.remove()从 DOM 中删除元素或者当你调用$(elem).html("new html"), jQuery 清除.data()有关任何已删除项目的数据。在这种情况下,最好不要将 jQuery 与纯 JavaScript 混合在一起。如果您正在使用.data(),那么您应该始终使用 jQuery 函数从 DOM 中删除项目,以便.data()被适当地清理。否则,您可能会以这种方式出现内存泄漏(.data()数据可能会泄漏,并且任何已删除的 DOM 对象在.data()可能会泄漏。但是,如果您只使用 jQuery 方法从 DOM 中删除项目(包括替换innerHTML),那么 jQuery 会适当地清理内容,并且不会出现泄漏。

因此,例如,这将造成内存泄漏:

// suppose elem is a DOM element reference

// store some data in jQuery's data storage on behalf of a DOM element
$(elem).data("someKey", "someValue");

// remove DOM element with plain Javascript
elem.parentNode.removeChild(elem);

因为您使用纯 Javascript 删除了 DOM 元素,所以 jQuery 没有机会清理您之前存储的数据。 DOM 元素本身将被垃圾回收,但是.data()您之前存储的值现在在 jQuery 的存储中是孤立的,本质上是“泄漏”,因为它可能永远不会被清除。另一方面,如果你这样做:

$(elem).data("someKey", "someValue");
$(elem).remove();

然后,jQuery 将看到您正在删除 DOM 元素,并且还将清除您存储的数据.data().

了解其工作原理的一个相当简单的方法是使用非最小化版本的 jQuery 创建几行脚本,然后单步调用$(elem).data("key", "whatever")在调试器中观察它是如何工作的。

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

jQuery data() 如何打破循环引用 的相关文章

随机推荐

  • IE10 User-Agent导致ASP.Net不发回Set-Cookie(IE10不设置cookie)

    Summary ASP Net 不发回Set Cookie使用 IE 10 时的标头 这意味着 例如 在使用表单身份验证时 您无法使用 IE10 登录 ASP Net 站点 Detail 我们目前正在针对 IE 10 预览版 2 测试我们的
  • 在卡萨布兰卡设置基本 HTTP 身份验证

    我正在尝试修改卡萨布兰卡教程包括基本的 HTTP 身份验证以访问繁荣API auto fileStream std make shared
  • 在 ASP.NET 中重新生成 SessionID

    请建议如何在 ASP NET 中重新生成新的会话 ID 如果我们使用 SessionManager 生成新的 id 那么它不会更改 Session SessionID 的值 请建议如何实现这一目标 基本上我想在放弃 Session 或使用
  • 如何通过单击电子邮件超链接打开 Outlook

    我有一个表 其中一列是电子邮件地址 我需要添加到此电子邮件地址的超链接 以便单击它会打开 Outlook 其中的电子邮件地址为TO field 有人可以帮忙吗 Try this a href title title Email a 这里 A
  • 在 iPhone 中以编程方式获取用户的 AppleId

    是否可以获取当前登录设备的用户的Apple ID 实际上 我实现了应用内购买 并且在用户购买应用程序时获得了设备 ID 和 Apple ID 不 这是不可能的 您可以使用 UIDevice currentDevice identifierF
  • Python:创建动态函数

    我有一个问题 我想创建动态函数 该函数将根据从数据库检索的值进行一些计算 我很清楚我的内部计算 但问题是如何创建动态类 我的结构是这样的 class xyz def Project start 2011 01 03 def Phase1 e
  • Java/Tomcat 被黑客攻击 [已关闭]

    Closed 这个问题是无关 目前不接受答案 最近我的 tomcat 服务器上出现了一些明显是黑客企图的文件 我支持使用 struts 和 ibatis 以及各种其他框架的旧应用程序 创建了三个文件 一个是实际 webapp 目录下的 sy
  • 升级到 JUnit4 并通过一起运行旧版 JUnit 3 测试和测试套件来保留它们

    我很惊讶到目前为止还没有找到答案 如果我错过了一些基本的东西 我会非常高兴知道这一点 有一个大型遗留代码库已升级到 Java 6 从 1 4 代码中存在大量 JUnit 3 测试 并被组织成测试套件 可以使用 Eclipse 中的 JUni
  • 如何首先定义嵌套的识别关系实体框架代码

    我目前首先在一个简单的测试应用程序中使用 EF5 代码来测试各种功能 我定义了两个实体之间的 识别关系 表示一对多链接 这里我定义了一个 PhotoCollection 它有很多子 Photo 实体 public class PhotoCo
  • 在 side div 中随机位置生成数字而不重叠

    我想在 div 内的随机位置显示随机数而不重叠 我能够在随机位置显示随机数 但它超出了盒子范围并相互重叠 这是我的代码 JSFiddle var width container innerWidth var height container
  • 在 Raphael Javascript 库中渲染 SVG 多边形

    据我所知 目前 Raphael Javascript 库中无法显示 SVG 多边形 我正在构建一个需要读取 SVG 并在 Raphael 中显示它们的应用程序 但是 许多 SVG 使用多边形 例如 我正在读取具有以下格式的多边形的 SVG
  • PyQt5 到 PySide2,加载不同类中的 UI 文件

    我有一个在 python3 6 下运行的 python 应用程序 并使用 PyQt5 加载 Ui 窗口 这些窗口是使用 Qt Designer 5 9 4 创建的 下面的代码显示了 PyQt5 的工作示例 现在我想拥有完全相同的功能 但使用
  • 返回具有嵌套级别和值的嵌套列表

    我想使用可视化一些深层嵌套的数据网络D3 我不知道如何在发送之前将数据转换为正确的格式radialNetwork 这是一些示例数据 level lt c 1 2 3 4 4 3 4 4 1 2 3 value lt letters 1 11
  • 是否可以将流量路由到特定 Pod?

    假设我正在 GKE 中运行我的应用程序 这是一个多租户应用程序 我创建了多个托管我的应用程序的 Pod 现在我想要 客户 1 1000 使用 Pod1 使用 Pod2 的客户 1001 2000 ETC 如果我有一个指向我的集群的 gclo
  • 使用 GLUT 在 3D OpenGL 世界中显示固定位置 2D 文本

    我有一个OpenGL项目使用GLUT 不是 freeglut 其中我想在视口上的固定位置显示 2D 文本 我的其余对象位于 3D 世界坐标中 这个答案一个相关的老问题说 GLUT 附带的位图字体是简单的 2D 字体 不适合在 3D 环境中显
  • 这是 .NET 的 Regex.Split 中的错误吗?

    我有两个正则表达式 用于Regex Split lt G and lt G 2 分割字符串时 A B C D E F G 第一个结果是 A B C D E F G 第二个结果是 A B A C D C E F E G 这里发生了什么 我以为
  • 让 html5 地理定位在用户每次重新加载页面时请求许可

    为什么我们需要它 我们的网站上有一些页面 允许用户输入一些数据并搜索其所在地区的其他客户 当用户打开该页面时 必须显示弹出消息 http foo bar com想要使用您当前的位置 之后 用户可以放弃它并手动填写位置字段或接受并自动重定向到
  • 从视频 URL 中提取缩略图

    我必须从视频 来自网址 中提取缩略图 我使用以下代码 NSString stringUrl video stringurl NSURL url NSURL URLWithString stringUrl AVURLAsset asset A
  • 用 C++ 读取另一个进程的标准输出

    在 Windows 中 有没有办法在 C 中启动进程 然后在完成后将其吐出到 stdout 中 如有必要 必须使用提升的权限 在 Vista 或更高版本上 运行该进程 我目前正在使用 ShellExecuteEx 启动进程并运行 while
  • jQuery data() 如何打破循环引用

    我读过一篇为什么它更好 and 它是如何实施的 但我真正不明白的是它如何打破循环引用 它如何打破参考圆 div1 data item div2 div2 data item div1 例如 上面的div互相指向 如何防止 我有一种预感 但我