[JS][jQuery]清空元素html("")、innerHTML="" 与 empty()的区别:关于内容泄露问题

清空元素html("")、innerHTML="" 与 empty()的区别

一、清空元素的区别
     1、错误做法一:
           $("#test").html("");//该做法会导致内存泄露
     2、错误做法二:
           $("#test")[0].innerHTML="";  ;//该做法会导致内存泄露
     3、正确做法:
	       //$("#test").empty();        

二、原理:

在 jquery 中用 innerHTML 的方法来清空元素,是必然会导致内存泄露的,由于 jquery 对于同一元素多事件处理没有直接采用浏览器事件模型,而是自己缓存事件,遍历触发,以及便于 trigger 程序触发 :

  1. // Init the element‘s event structure
  2. var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
  3. handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
  4. // Handle the second event of a trigger and when
  5. // an event is called after a page has unloaded
  6. return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
  7. jQuery.event.handle.apply(arguments.callee.elem, arguments) :
  8. undefined;
  9. });

采用 data 方法,将一些数据关联到了元素上面,上述事件即是采用该机制缓存事件监听器。

那么就可以知道,直接 innerHTML=“” 而不通知 jquery 清空与将要删除元素关联的数据,那么这部分数据就再也释放不了了,即为内存泄露。

  1. remove: function( selector ) {
  2. if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
  3. // Prevent memory leaks
  4. jQuery( "*", this ).add([this]).each(function(){
  5. jQuery.event.remove(this);
  6. jQuery.removeData(this);
  7. });
  8. if (this.parentNode)
  9. this.parentNode.removeChild( this );
  10. }
  11. },
  12. empty: function() {
  13. // Remove element nodes and prevent memory leaks
  14. jQuery(this).children().remove();
  15. // Remove any remaining nodes
  16. while ( this.firstChild )
  17. this.removeChild( this.firstChild );
  18. }
时间: 2024-11-14 12:22:31

[JS][jQuery]清空元素html("")、innerHTML="" 与 empty()的区别:关于内容泄露问题的相关文章

[JS][jQuery]清空元素html("")、innerHTML="" 与 empty()的区别 、remove()区别

清空元素html("").innerHTML="" 与 empty()的区别 一.清空元素的区别     1.错误做法一:           $("#test").html("");//该做法会导致内存泄露 2.错误做法二:            $("#test")[0].innerHTML="";  ;//该做法会导致内存泄露 3.正确做法:        //$("#t

js jquery插入元素后事件会被注销

  js jquery插入元素后事件会被注销 document.body.innerHTML += <div id="dd">test</div>  //这个会注销事件 $(document.body).append(str);//使用这个 也可以绑定事件. 例子: //快捷键双击 $(".app_shortcut_item").dblclick(function () { var id = $(this).attr("id&quo

js jquery 获取元素(父节点,子节点,兄弟节点),元素筛选

转载:https://www.cnblogs.com/ooo0/p/6278102.html js jquery 获取元素(父节点,子节点,兄弟节点) 一,js 获取元素(父节点,子节点,兄弟节点) var test = document.getElementById("test"); var parent = test.parentNode; // 父节点 var chils = test.childNodes; // 全部子节点 var first = test.firstChil

js/jquery获取元素,元素筛选器

1.js获取元素 var test = document.getElementById("test"); var parent = test.parentNode; // 父节点 var chils = test.childNodes; // 全部子节点 var first = test.firstChild; // 第一个子节点 var last = test.lastChile; // 最后一个子节点 var previous = test.previousSbiling; //

js jquery 获取元素(父节点,子节点,兄弟节点)

一,js 获取元素(父节点,子节点,兄弟节点) var test = document.getElementById("test"); var parent = test.parentNode; // 父节点 var chils = test.childNodes; // 全部子节点 var first = test.firstChild; // 第一个子节点 var last = test.lastChile; // 最后一个子节点 var previous = test.previ

js/jquery设置元素隐藏和显示

//js 元素隐藏 document.getElementById('li11').style.display = 'none'; //js 元素显示 document.getElementById('li11').style.display = 'block'; //jquery元素隐藏 $('#li11').hide(); //jquery元素显示 $('#li11').show(); //还有一种方法,在css中设置 .hide{ display: none; } 然后通过js $('#l

JS/JQuery获取元素

一.Javascript获取select下拉框选中的的值 I:javascript原生的方法   1:拿到select对象: var  myselect=document.getElementById("test"); var myselect = document.all["test"];   2:拿到选中项的索引:var index=myselect.selectedIndex ;             // selectedIndex代表的是你所选中项的in

JS + jQuery 实现元素自动滚动到底部,兼容IE、FF、Chrome

HTML代码: <ul class="tasklog-dialog-ul" id="auto_to_bottom"> <li>删除虚拟机快照成功</li> <li>删除虚拟机快照成功</li> <li>删除虚拟机快照成功</li> <li>删除虚拟机快照成功</li> <li>删除虚拟机快照成功</li> <li>删除虚拟机

一个例子看清楚JQuery子元素选择器children()和find()的区别

最近在我们的hybrid app项目开发中定位出了一个问题,通过这个问题了解下JQuery选择器find()和children()的区别.问题是这样的:我们的混合app是一个单页面应用(main.html),逻辑上的页面是通过项目自定义的.mspl文件(其实就是html文件)来呈现的.比如a.mspl.b.mspl.c.mspl加载的时候,都会插入到main.html中,但是每次只显示1个mspl文件,当b.mspl显示的时候,a.mspl和c.mspl就会被隐藏.在a.b.c这3 个页面上都会