jQuery 泄漏问题已解决,但为什么呢?

2024-01-19

我正在开发一个包含大量 JavaScript 的大型企业应用程序。够了,我不可能遍历并修复过去 5 年开发中创建的所有小循环引用。在研究解决方案时,我遇到了这个小的 jQuery 黑客/补丁:

http://kossovsky.net/index.php/2009/07/ie-memory-leak-jquery-garbage-collector/ http://kossovsky.net/index.php/2009/07/ie-memory-leak-jquery-garbage-collector/

并决定尝试一下。令人惊讶的是,它有效! sIEVE 在我之前发现的地方没有显示泄漏,iexplore 任务正在维护更易于管理的内存占用。

我的问题是,为什么这有效? jQuery.remove 调用 .removeChild,它应该删除该元素,但显然没有。该补丁会将目标元素附加到新的垃圾收集器 div 上,然后将其清除。为什么patch方法的remove可以完全释放内存,而jQuery的remove函数却不能?我希望了解其工作原理,以便在将其签入更大的应用程序之前可能改进解决方案。


这是.remove当前 jQuery 版本 (1.6.2) 中的方法。请注意,它调用.cleanData:

// keepData is for internal use only--do not document
    remove: function( selector, keepData ) {
        for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
            if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
                if ( !keepData && elem.nodeType === 1 ) {
                    jQuery.cleanData( elem.getElementsByTagName("*") );
                    jQuery.cleanData( [ elem ] );
                }

                if ( elem.parentNode ) {
                    elem.parentNode.removeChild( elem );
                }
            }
        }

        return this;
    },

And the .cleanData它调用的方法,其中提到了票号并据称防止了可怕的泄漏(根据其中一条评论):

cleanData: function( elems ) {
        var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,
            deleteExpando = jQuery.support.deleteExpando;

        for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
            if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
                continue;
            }

            id = elem[ jQuery.expando ];

            if ( id ) {
                data = cache[ id ] && cache[ id ][ internalKey ];

                if ( data && data.events ) {
                    for ( var type in data.events ) {
                        if ( special[ type ] ) {
                            jQuery.event.remove( elem, type );

                        // This is a shortcut to avoid jQuery.event.remove's overhead
                        } else {
                            jQuery.removeEvent( elem, type, data.handle );
                        }
                    }

                    // Null the DOM reference to avoid IE6/7/8 leak (#7054)
                    if ( data.handle ) {
                        data.handle.elem = null;
                    }
                }

                if ( deleteExpando ) {
                    delete elem[ jQuery.expando ];

                } else if ( elem.removeAttribute ) {
                    elem.removeAttribute( jQuery.expando );
                }

                delete cache[ id ];
            }
        }
    }

这是评论中提到的票。显然八个月前就已经修复了:

http://bugs.jquery.com/ticket/7054#comment:10 http://bugs.jquery.com/ticket/7054#comment:10

根据 Dave Methvin 的说法,解决方案似乎是确保事件处理程序中的 DOM 元素引用被 cleanData 删除,以避免 IE6/7/8 内存泄漏。

换句话说,将事件处理程序中对 DOM 元素的引用设置为null否则一些很棒的浏览器,无需提及任何名称cough IE cough会泄漏内存。

discardElement(来自您的链接)将元素插入容器中,然后清空容器,从而无效化对该元素的任何引用。

考虑到这一点,我建议升级 jQuery。您指向的文章是 2009 年的,两年大约相当于 jQuery 开发时间的四百多个工时。

最后,这里有一些关于 Internet Explorer 中泄漏模式的有趣(而且长得可笑)的读物:

  • 了解和解决 Internet Explorer 泄漏模式 http://msdn.microsoft.com/en-us/library/bb250448%28v=vs.85%29.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jQuery 泄漏问题已解决,但为什么呢? 的相关文章

  • 在版本 4.4.6 中禁用 ckeditor 上下文菜单

    我在 Rails4 项目中使用 ckeditor 我尝试了 ckeditor gem 和 ckeditor rails gem 来提供 ckeditor 库 这里有多个帖子 人们希望删除 ckeditor 上下文菜单 以便可以显示本机浏览器
  • Number.IsNaN() 比 isNaN() 更糟糕吗

    Soooooo isNaNJavaScript 显然被破坏了 比如 isNaN isNaN isNaN true isNaN false isNaN 0 返回 false 当它们看起来都是 不是数字 在 ECMAScript 6 中 草案包
  • 如何使用javascript确保元素仅在圆上朝一个方向移动?

    好吧 我承认我对三角学真的很糟糕 出于上下文的考虑 我将添加我在这里提到的问题中的内容 参考问题 https stackoverflow com a 39429290 168492 https stackoverflow com a 394
  • 从 HTTP 登录到 HTTPS

    我的网站默认使用 HTTP 我确实有一个启用 HTTPS 的证书 但只有其上的某些区域强制建立安全连接 登录是通过 Ajax 处理的 我想开始使用 SSL 即使请求来自 HTTP 我尝试强制请求的地址具有 HTTPS 并且它完美地回复 然而
  • IntersectionObserver是否支持水平滚动观察?

    我制作了几个垂直滚动 IntersectionObserver 模块 但我对水平滚动感兴趣 根将是 div 观察目标将是 img 我想观察当 img 放大但 div 保持视口宽度时的变化 我什至不确定移动 Safari 是否会将缩放后的图片
  • 导航栏下拉菜单(折叠)在 Bootstrap 5 中不起作用

    我在尝试使用以下命令创建响应式菜单或下拉按钮时遇到问题Bootstrap 5一切似乎都正常 导航图标和下拉图标出现 但它不起作用 当我单击nav图标或dropdown按钮 无dropdown menu apears 我想特别提到的是 我还包
  • JavaScript 中的 Promise 有什么意义?

    一个承诺是一个 可能现在可用 或将来可用 或永远不可用的值 来源 MDN 假设我有一个想要处理图片的应用程序 图片已加载 例如在算法在后台使用它之后 或某种其他类型的延迟 现在我想检查一下图片是否可以在future 通过使用承诺 而不是回调
  • 如何使用角度材料在具有可扩展行的表格中创建嵌套垫表

    我有以下数据 id c9d5ab1a subdomain wing domain aircraft part id c9d5ab1a info mimetype application json info dependent parent
  • IE 中的 XPath 查询使用从零开始的索引,但 W3C 规范是从一开始的。我应该如何处理差异?

    问题 我正在转换目前仅适用于 Internet Explorer 的相对较大的 Javascript 代码 以便使其也适用于其他浏览器 由于代码广泛使用 XPath 我们做了一些兼容性功能以使事情变得更容易 function selectN
  • 如何在另一个自定义 Hook 中使用返回值的自定义 Hook?

    我正在使用 React native 其中有一个名为的自定义 HookuseUser使用以下方法从 AWS Amplify 获取用户信息Auth getUserInfro方法 然后获取返回对象的一部分并用它设置一个状态变量 我还有另一个名为
  • 使用 JavaScript 移动页面上的按钮

    我的按钮可以移动 但奇怪的是 我无法弄清楚偏移是否有问题 我希望我的按钮随着鼠标光标移动 但现在它的移动方式不是我想要的 有时它会消失 另外 创建的新按钮是重叠的 我不知道如何解决这个问题并拥有更好的外观 var coorA var coo
  • 编辑第一个选项名称

    我有以下我无法访问的代码 我想要做的是将一些文本添加到现在为空的第一个选项中 诸如 选择地址 之类的文本
  • 使用 Google 日历源时如何禁用 FullCalendar 中的活动链接?

    我正在使用 FullCalendar 库从 Google 日历加载日历中的事件 不幸的是 事件添加到日历后 它们是可点击的 当您点击该活动时 您会自动重定向到 Google 日历页面以查看该特定活动 或者如果您有足够的访问权限 则可以直接对
  • JavaScript eval("{}") 返回行为?

    根据ECMA 262 规范 http www ecma international org publications files ECMA ST Ecma 262 pdf 以下语句返回1 eval 1 eval 1 eval 1 var a
  • 聆听 Angular 2 中的元素可见性

    我正在为我的网络应用程序使用 Bootstrap 和 Angular 2 v4 我想监听指令中的元素以了解可见性变化 我的元素有一个可以隐藏其子元素的父元素hidden sm up我需要在每次隐藏或显示时触发一个函数 div hidden
  • 使用 Javascript 设置 cookie [重复]

    这个问题在这里已经有答案了 我正在尝试构建我的第一个移动应用程序 它需要连接到我的 mysql 数据库并使用 json 返回数据 这很好 目前我有一个登录系统 一旦确定用户名和密码存在 它就会返回一条成功消息 对于下一步 我想在我的页面上使
  • Highcharts jQuery 渲染问题 - 所有浏览器

    我在尝试使用构建堆积柱形图时遇到了一个奇怪的问题高图表 http www highcharts com 当图表呈现时 在您调整浏览器大小之前 不会显示列无论如何 导致图表重绘 我认为 图表的其余部分显示 轴 标题等 但不显示列本身 我在 I
  • 使用 Enzyme 测试 `React.createRef` api

    我想测试下面的类 它使用React createRef api 不过 快速搜索并没有发现任何这样做的例子 有人成功过吗 我该如何嘲笑裁判 理想情况下我想使用shallow class Main extends React Component
  • 没有输入的 jQuery 日期选择器

    我有一个相当复杂的网络应用程序 我想向其中添加一些日期选择 UI 我遇到的问题是我无法从文档中弄清楚如何真正控制日期选择器的出现方式和时间 不涉及任何表单元素 不 我不会添加秘密表单字段 因此简单的开箱即用方法根本行不通 我希望有人可以提供
  • 使用velocity.js制作可拖动元素的动画

    我正在使用velocity js 为用户拖动的可拖动 SVG 元素设置动画 然而 velocity js 将先前的 mousemove 坐标排队并通过所有后续的 mousemove 坐标进行动画处理 我想要的是velocity js 不要对

随机推荐

  • 错误:“y_true 中的类数不等于 'y_score' 中的列数”

    我有一个不平衡的多类数据集 当我尝试计算 roc auc score 时 我收到此错误 ValueError y true 中的类数不等于 y score 中的列数 这是代码 model svm SVC kernel linear prob
  • 使用 Firefox Addon SDK 列出所有驱动器

    是否有跨操作系统的方法来使用 firefox addon sdk 列出所有已安装驱动器 硬盘 USB 驱动器等 的路径 我找到了适用于 Windows 的代码 但找不到跨操作系统的解决方案 Components utils import r
  • LINQ to XML - 尝试通过元素的属性值选择元素列表

    我试图从 XML 文档中获取元素列表 其中节点具有特定的属性值 该文档的结构如下
  • 从 C# 中的函数返回类

    我可以从 C 中的函数返回类对象作为返回值 而不是返回 string 或 int 或 etc C 中的类对象是一种类型 所以你绝对可以从函数返回它 public Type Foo return typeof string public Ty
  • OpenMp 与 IOS/Android 的兼容性

    我正在尝试做什么 我正在研究C c 为所有平台构建产品的代码 我操作系统 Android Windows 移动 桌面 Mac Linux 到目前为止我做了什么 是的 有许多在线链接讨论 OpenMp 与不同处理器和操作系统的兼容性 但很难从
  • xmpp框架iOS新用户注册方法

    我已经开发了适用于 iOS 的 XMPP 聊天客户端 现在我正在研究如何从 iOS 本身进行新用户注册 任何人都可以帮助注册新用户的方法 因为它需要与服务器通信并将用户名和密码存储到服务器数据库中 请帮帮我 我已经搜索了两天了 NSMuta
  • cursor.fetchone() 返回 None 但数据库中的行存在

    我正在用 python 编写一个与 MySQL 数据库交互的程序 对于 sql 查询 我使用 MySQLdb 问题是fetchone 返回 None 但通过数据库浏览器我可以看到that行存在 这段代码 query SELECT FROM
  • 如何使用Python库生成后缀树? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要可以构建后缀树 特别是广义后缀树的Python库 你能给我推荐一些图书馆吗 谢谢 请参阅以下库
  • 在 JApplet 上运行的 JPanel

    我正在设计一个 JApplet 基本上这个小程序将允许用户绘制二次方程图 并插入 x 轴和 y 轴的范围 但要达到这一目标 还有很多工作要做 我仍处于设计界面的阶段 这是我的代码 import java awt Dimension impo
  • Spring启动-配置EntityManager

    我正在使用Google guice在我的项目中 现在我尝试将框架转换为SpringBoot完全 我配置了 Beanpersistence xml like below in Autowired Bean name transactionMa
  • Java awt.Robot:CTRL+ALT+DEL 未调出所需的屏幕

    我最近刚刚发现 awt Robot 库 我很高兴能够使用它 我以为我应该对我的朋友开个小恶作剧 让机器人按控制 Alt 删除按锁定计算机按钮 但我无法让程序调出控制 Alt 删除屏幕 这是我的代码 import java awt impor
  • 构建发布时出现颤动警告

    当我尝试构建 release 我的应用程序时 我不断收到这些红色警告 尝试扑干净 flutter clean cache 没有任何作用 所有包都是最新的 我的构建 Gradle buildscript ext kotlin version
  • 高效地将字节数组转换为十进制

    如果我有一个字节数组并且想要转换该数组的连续 16 字节块 其中包含 net 的表示形式Decimal 转化为适当的Decimalstruct 最有效的方法是什么 在我正在优化的情况下 以下代码在我的分析器中显示为最大的 CPU 消耗者 p
  • 如何在.NET Framework 3.5上使用Stream.CopyTo?

    我找到了上传代码 该代码包含Stream CopyTo method Example file Stream CopyTo requestStream NET Framework 4 0 如何将 file Stream 复制到 reques
  • 比较 list 类型的 Python 字典值,看看它们是否按顺序匹配

    prefs s1 a b c d e s2 c d e a b s3 a b c d e s4 c d e b e 我有一本字典 我想比较每个键的值 类型 列表 以查看它们是否按该顺序存在 因此 本质上我试图迭代每个键值对 并将列表类型的值
  • 在 Android 中从 Facebook 检索用户名和性别

    这就是我检索存储在共享首选项中的信息 然后比较用户名和密码是否存在的方法 如果用户登录 我可以显示另一个活动 SharedPreferences 设置 getSharedPreferences logindetails 0 String u
  • Java 中的悬空线程

    Java 中的悬空线程会发生什么 就像我创建一个应用程序并且它生成多个线程一样 其中一个线程未完成 主程序在此之前完成 这条悬空的线会发生什么 它会无限地留在线程池中还是 JVM 将在阈值时间段后杀死线程 这取决于线程是否被标记为 守护进程
  • 在 char 中分配多个字符

    为什么这个程序给出输出 y include
  • 如何对结构体数组进行排序

    如何按项目名称的字母顺序对 oo 结构数组进行排序 oo struct Item Quill Ink Pen Pencil Cost 10 2 1 我尝试使用 sort 函数但它不起作用 谢谢 首先索引您的字段 在本例中oo Items它返
  • jQuery 泄漏问题已解决,但为什么呢?

    我正在开发一个包含大量 JavaScript 的大型企业应用程序 够了 我不可能遍历并修复过去 5 年开发中创建的所有小循环引用 在研究解决方案时 我遇到了这个小的 jQuery 黑客 补丁 http kossovsky net index