jQuery .html() 方法是否泄漏内存?

2024-03-14

我正在用requestAnimationFrame循环,包括打电话给jQueryhtml()方法。它只是在游戏操作旁边的状态窗口中更新文本。

我注意到 Chrome 的时间轴监视器,DOM 节点不断上升,一分钟内有数千个!当我更改代码时:

// creates a ton of DOM nodes
$("#readout").html(data);

to

// DOM nodes does not increase over time
document.getElementById('readout').innerHTML = data;

“内存泄漏”消失了。


简短回答:不。

长答案:您的页面/代码中可能还有其他事情发生。

内存泄漏通常是由 Javascript 引擎和 DOM 之间的循环引用引起的。例如:

var div = document.getElementById('divId');
div.onclick = function() {
    doSomething(div);
};

该脚本获取对页面上 div 的引用。到目前为止我们还好。下一行将一个函数分配给 DOM 上的事件处理程序,创建从 DOM 到 Javascript 引擎的引用 - 到了泄漏的一半。函数体使用标签,它创建一个闭包 - 标签引用与函数一起保存以供将来调用。这样就完成了 tag -> function (DOM -> JS) 和 function -> tag (JS -> DOM) 之间的循环引用,因此两者将一直保留在内存中,直到浏览器进程被销毁。

因此,为了使您提到的任何一行代码泄漏,都必须消除像上面那样附加事件的标签(或遵循类似模式的数据)。但是,jQuery 的 .html(string) 不遗余力地阻止这些:

// Remove element nodes and prevent memory leaks
elem = this[i] || {};
if ( elem.nodeType === 1 ) {
    jQuery.cleanData( getAll( elem, false ) );
    elem.innerHTML = value;
}

所以它循环通过all您正在运行 .html(string) 并在其上运行 cleanData() 的标签内的标签,这又会执行以下操作:

jQuery.removeEvent( elem, type, data.handle );

从而防止泄漏。

所以为了用这个方法泄漏内存not浏览器内置的 .innerHTML 你必须触发一些非常模糊的浏览器错误(似乎不太可能),或者更有可能发生其他事情并且你将其误认为是 jQuery 的 .html(string)。

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

jQuery .html() 方法是否泄漏内存? 的相关文章

  • 检索受“rowspan”影响的行的列索引的最有效方法是什么?

    考虑下表 table thead tr th th th A th th B th th C th tr thead tbody tr th 1 th td Apples td td Oranges td td Pears td tr tb
  • jPlayer 无法在 Firefox 中播放 mp3

    我正在集成 jplayer 来播放由使用 jQuery 的单击事件触发的精选 mp3 文件 用于实现此目的的代码是 play link click function jquery jplayer 1 jPlayer destroy srcF
  • Woocommerce 中的 Ajaxify 标头购物车项目计数

    我正在为 WordPress 创建一个自定义 woocommerce 集成主题 我在顶部有一个 blob 显示购物车中的商品总数 我想使用 Jquery 更新此 blob 无需重新加载页面 我能够通过获取购物车中的当前数量来增加商品数量bl
  • 使用 jQuery 获取 JSON Facebook Graph API 用户信息

    我正在尝试使用图形 API 来获取有关用户的一些基本信息 无需用户授权 只需获取公共详细信息 我正在尝试使用 jQuery 和 getJSON 来获取数据并解析它 但我很难弄清楚如何访问我想要的键值对 我想要有类似的东西 var fburl
  • 如何加载Jquery Tiny滚动条

    所以我想自定义一个滚动条 我发现了一个很小的滚动条 这是一个jquery插件 http baijs nl tinyscrollbar http baijs nl tinyscrollbar 问题是 无论如何我都无法让它工作 我将 Jquer
  • 如何使用javascript检查图像url是否为404

    使用案例 当 src 不为空并且 alt 标签不为空时 则显示 src 的图像 然后检查 src 图片 url 不是 404 当 src 为空且 alt 不为空时 显示名字的图像 当 src 和 alt 为空时显示默认图像 HTML img
  • jQuery hide() 动画向右滑动

    使用 jQuery 的hide 使用可选的持续时间参数的函数 我可以在我的网站上获得一些警报框 以优雅地滑出屏幕并消失 隐藏动画的默认方向似乎是向左滑动 尽管此行为未在hide 定义页 http api jquery com hide 我需
  • 使用 jQuery / JavaScript 将 Alpha 通道添加到背景颜色

    我有一个 jQuery 函数 它添加了一个Alpha通道到一个背景颜色当事件发生时 这是我的jsFiddle http jsfiddle net liormb SxQt8 1 CSS div background color rgb 100
  • jquery ui 选项卡不再支持 cookie?怎么办?

    我很抱歉这是一个开放式问题 但我很茫然 从 jquery UI 1 9 版本开始 它们使用cookie选项以保存跨多个页面的选项卡的活动状态 http jqueryui com upgrade guide 1 9 deprecated co
  • 根据 MVC 中的文化的日期时间格式

    我有一个 MVC 视图 其中列出了一个名为 CreatedOn 的日期时间类型列 值的格式如下 日 月 年 时 分 秒 当我单击编辑链接修改值时 我获得相同的格式 当我修改编辑值时 出现验证错误 字段 CreatedOn 必须是日期 我的
  • Jquery 在输入/按键时不起作用

    我正在尝试创建一个简单的搜索框 允许您根据在输入字段中输入的关键字进行搜索 如果您按下 提交 按钮 此操作就可以正常工作 我还希望能够按 Enter 或 Return 键来启动搜索 我尝试过使用 on 函数 它似乎只适用于单击 但在输入或按
  • 从数据库中给定时间起经过的时间

    我有一个 HTML 表 其中包含从数据库中提取的记录 我正在使用 PHP MySQL 我的表中名为 Timer 的列未从数据库中检索 我需要在此处显示经过的时间 从数据库中的特定时间开始 例如 假设现在的时间是2013年2月21日下午6点2
  • PHP 对象创建和内存使用

    一个基本的虚拟类 class foo var bar 0 function foo function boo echo memory get usage echo n foo new foo echo memory get usage ec
  • 如何使 Nivo 滑块响应式

    我在 WordPress 中使用 NivoSlider 并对主题实现了一些响应式 css 我也修复了 Nivo Slider 中图像的宽度和高度以及背景大小 但它仅显示一次正确的大小 然后在滑块中显示大图像 这是该网站的链接 Website
  • 使用 jquery 时出现控制台错误 - Uncaught TypeError: Object # has no method

    我尝试使用以下 js 添加类或 css 样式 但出现控制台错误 var i 0 question i addClass show 收到以下控制台日志错误 Uncaught TypeError Object has no method add
  • 通过ajax POST提交两次表单

    插入到mysql using php通过文件调用AJAX 前insert语句php代码执行select查询到查找重复记录并继续insert statement Issue 从ajax调用php文件时 它执行了两次并得到作为重复记录的响应 好
  • 如何使用 Ajax 对 Oracle APEX 表格表单执行逐行验证?

    使用我执行的相同验证 处理 基于此线程 在 Oracle APEX v4 2 2 中通过 Ajax 调用 Oracle 函数进行现场验证 https stackoverflow com questions 21474303 calling
  • 如何使用 jQuery 使 div 全屏并位于所有其他元素之上?

    div style background color grey div 有简单的方法吗 定义样式overlay或类似的东西 然后你可以使用 jQuery 添加新类 myDiv addClass overlay 如果你想添加点击事件 你可以这
  • 属性更改时的 jQuery 事件

    我需要一个函数在 divs data page index 属性更改时运行 var active swipeview active dpi parseInt active attr data page index left data pag
  • d3.js 更新视觉效果

    我有一个与 d3 js 放在一起的树形图 我通过 getJSON 填充数据 效果很好 但是 我在 setInterval 方法中具有此功能 并且它似乎并没有刷新自身 var treemap d3 layout treemap padding

随机推荐