我有一个应用程序,允许用户在回发后查看特定案例的详细信息。 每次用户从服务器请求数据时,我都会下拉以下标记。
棘手的部分是确定哪些引用仍然存在于违规节点。 你正在以这种方式做到这一点 – 你将所有标记添加到页面,然后删除你不想要的东西。 我会这样做: var div = document.createElement('div'); // (Don't append it to the document.) $(div).html(xhtml); var stuffToKeep = $(div).find("form:eq(1)> *").filter( function() { return $(this).attr('id') !== ''; } ); parentObj.append(stuffToKeep); // Then null out the original reference to the DIV to be safe. div = null; 这不能保证能够阻止泄漏,但这是一个良好的开端。 function discardElement(element) { var garbageBin = document.getElementById('IELeakGarbageBin'); if (!garbageBin) { garbageBin = document.createElement('DIV'); garbageBin.id = 'IELeakGarbageBin'; garbageBin.style.display = 'none'; document.body.appendChild(garbageBin); } // move the element to the garbage bin garbageBin.appendChild(element); garbageBin.innerHTML = ''; } 资源 remove()及其同类只删除DOM中的元素。 它们仍然存在于某个地方的记忆中。 这是AJAX和Web 2.0的已知问题。 除了设计您的网站以确保偶尔刷新页面以消除内容之外,您几乎无能为力。 我认为“不断增长的内存消耗”有些被误解了。 它与浏览器内部的内存管理(以及一般的Windows)有关,而不是与JS代码有关。 内存管理员通常会不断分配(或避免释放)。 在基于页面文件和内存映射的系统上,分配和释放内存非常耗时。 因此,即使您的节点从实际文档结构和DOM中释放 – 几乎没有任何方法可以通过“实时”从Windows本身进行测量。 试试这个: 启动Taskmanager,切换到进程选项卡并观察浏览器的内存 在一个分配100.000个节点的HTML文档中加载,观察内存消耗的增长 单击页面中的按钮以释放所有节点。 请注意,在内存释放方面几乎没有发生。 现在最小化浏览器窗口,并再次最大化它。 在90%的情况下,浏览器现在会转储内存,如果没有使用,你会看到它真正消耗了多少。 你可以让一个浏览器消耗500兆字节的ram(不是上面提到的例子),但是当你最小化并最大化它时,它会释放所有内容,突然它只使用50兆字节。 Jquery自定义属性 将事件添加到ajax附加内容 jQuery追加DOMjQuery:添加dom元素(如果它不存在)将外部对象添加到现有数组一个类型的jQuery .prev(),无论它是父类等如何在DOM树中保存/恢复对象的位置?确定元素是否为表单字段DOMNodeInserted在body上执行DOM操作时表现得很奇怪Safari:通过DOM更新时,绝对定位的DIV不会移动使用jquery修改textarea上的撤消/重做行为 Go! Interesting Posts 如何生成所有可能的CSS 2选择器组合?性能:纯CSS与jQueryjQuery:不能只选择附加的元素jQuery与普通javascript:构建DOM树时append和appendChild之间的差异DOM没有满载?如何通过Jquery找出类中是否存在样式?检测DOM元素顺序的变化使用跨浏览器支持的jQuery更改类型交换2个html元素并在其上保留事件侦听器将页面元素索引到JSON对象? 或者每次jQuery选择它?
棘手的部分是确定哪些引用仍然存在于违规节点。
你正在以这种方式做到这一点 – 你将所有标记添加到页面,然后删除你不想要的东西。 我会这样做:
var div = document.createElement('div'); // (Don't append it to the document.) $(div).html(xhtml); var stuffToKeep = $(div).find("form:eq(1)> *").filter( function() { return $(this).attr('id') !== ''; } ); parentObj.append(stuffToKeep); // Then null out the original reference to the DIV to be safe. div = null;
这不能保证能够阻止泄漏,但这是一个良好的开端。
function discardElement(element) { var garbageBin = document.getElementById('IELeakGarbageBin'); if (!garbageBin) { garbageBin = document.createElement('DIV'); garbageBin.id = 'IELeakGarbageBin'; garbageBin.style.display = 'none'; document.body.appendChild(garbageBin); } // move the element to the garbage bin garbageBin.appendChild(element); garbageBin.innerHTML = ''; }
资源
remove()及其同类只删除DOM中的元素。 它们仍然存在于某个地方的记忆中。
remove()
这是AJAX和Web 2.0的已知问题。 除了设计您的网站以确保偶尔刷新页面以消除内容之外,您几乎无能为力。
我认为“不断增长的内存消耗”有些被误解了。 它与浏览器内部的内存管理(以及一般的Windows)有关,而不是与JS代码有关。 内存管理员通常会不断分配(或避免释放)。 在基于页面文件和内存映射的系统上,分配和释放内存非常耗时。
因此,即使您的节点从实际文档结构和DOM中释放 – 几乎没有任何方法可以通过“实时”从Windows本身进行测量。
试试这个:
启动Taskmanager,切换到进程选项卡并观察浏览器的内存
在一个分配100.000个节点的HTML文档中加载,观察内存消耗的增长
单击页面中的按钮以释放所有节点。 请注意,在内存释放方面几乎没有发生。
现在最小化浏览器窗口,并再次最大化它。 在90%的情况下,浏览器现在会转储内存,如果没有使用,你会看到它真正消耗了多少。
你可以让一个浏览器消耗500兆字节的ram(不是上面提到的例子),但是当你最小化并最大化它时,它会释放所有内容,突然它只使用50兆字节。