9

<div/>我有一个弹出插件,它使用 AJAX 调用的响应设置 a 的 html 内容。

每次我打开弹出窗口时,我都会在代码中调用$("#popup").html(response). 这会用新内容覆盖现有的 html 内容。

我应该在调用$("popup").empty()之前调用$("popup").html(response),以便释放之前在$("popup")div 中的对象使用的浏览器内存吗?(最终防止内存泄漏)

PS:如果我打电话$("popup")[0].innerHTML = response怎么办?我应该调用.empty()方法吗?

4

4 回答 4

8

简短的回答没有。

jQuery.fn.htmlDOMNode.innerHTML =在做其他几件事后使用。一种是删除节点上的任何存储数据(通过 存储$.fn.data),请参阅http://james.padolsey.com/jquery/#v=git&fn=jQuery.fn.html以获得完整的源代码概述。

.innerHTML删除子元素并替换为新的 html。但要小心内存泄漏。我会jQuery.fn.empty在设置 innerHTML 之前使用。例如。

var a = document.createElement('div'),
    b = document.createElement('div');

    b.appendChild(a);

    b.innerHTML = 'new innerHMTL'.

你会认为一切正常。但是节点替换/删除仍然被捕获在变量中a,因此不会被扔给垃圾收集器。我不确定 jQuery 是否在内部存储 DOMNodes,直到您调用jQuery.removeData等。

于 2013-06-03T12:26:31.310 回答
5

html方法的jQuery文档说:

当 .html() 用于设置元素的内容时,该元素中的任何内容都会被新内容完全替换。此外,在用新内容替换这些元素之前,jQuery 从子元素中删除了其他结构,例如数据和事件处理程序。

所以你不需要打电话empty()

于 2013-06-03T12:26:13.340 回答
2

无需调用empty()html( response) 方法现有ovverides内容

于 2013-06-03T12:25:24.137 回答
0

除了 .empty() 运行得更快并且 .html() 可以覆盖上下文的内容之外没有区别

http://jsperf.com/jquery-empty-vs-html/17

于 2013-06-03T12:48:53.397 回答