jquery innerHtml

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"   
  2.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  3. <html>  
  4.     <head>  
  5.         <meta content="text/html;charset=utf-8" http-equiv="content-type" />  
  6.         <script src="jquery-1.3.2.js" type="text/javascript">  
  7.         </script>  
  8.         <style type="text/css">  
  9.             #inner {   
  10.                 margin:0 auto;   
  11.                 width:150px;   
  12.                 height:50px;   
  13.                 border:1px solid green;   
  14.             }   
  15.         </style>  
  16.         <script type="text/javascript">  
  17.         $(function(){   
  18.             $("#inner").click(function(){   
  19.                 //错误,引起内存泄露   
  20.                 $("#test")[0].innerHTML="";   
  21.                    
  22.                 //正确做法   
  23.                 //$("#test").empty();   
  24.             });   
  25.                
  26.         });   
  27.         </script>  
  28.         <title>测试</title>  
  29.     </head>  
  30.     <body>  
  31.         <div style="height:500px;width:500px;border:1px solid red;padding-top:100px;" id="test">  
  32.             <div id="inner">click to remove me</div>  
  33.         </div>       
  34.     </body>  
  35. </html>  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
	<head>
		<meta content="text/html;charset=utf-8" http-equiv="content-type" />
		<script src="jquery-1.3.2.js" type="text/javascript">
		</script>
		<style type="text/css">
			#inner {
				margin:0 auto;
				width:150px;
				height:50px;
				border:1px solid green;
			}
		</style>
		<script type="text/javascript">
		$(function(){
			$("#inner").click(function(){
				//错误,引起内存泄露
				$("#test")[0].innerHTML="";
				
				//正确做法
				//$("#test").empty();
			});
			
		});
		</script>
		<title>测试</title>
	</head>
	<body>
		<div style="height:500px;width:500px;border:1px solid red;padding-top:100px;" id="test">
			<div id="inner">click to remove me</div>
		</div>	
	</body>
</html>

 

 

场景:

inner div 就是常见的我们可能使用 ajax 从服务器动态构造的元素,或者注入的片断html,效果为点击 inner 后就把它以及它的兄弟清除出去,依照传统的思路,直接 innerHTML =“” 就好了 ,可能你会想到所有删除元素的事件监听器应该清楚掉,但是对于除了 ie6 (引起内存泄露)以外的浏览器,清除事件监听器不是必要的 。



jquery 机制:

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

 

Js代码 复制代码  收藏代码
  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 清空与将要删除元素关联的数据,那么这部分数据就再也释放不了了,即为内存泄露。




解决:

jquery 已经想到了这一方面,提供了 empty 函数,其思想就是,对节点的所有子,孙,重孙.....节点( $("*",this) ),先清空它们关联的数据,再进行节点的删除:

 

Js代码 复制代码  收藏代码
  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.   
  13.     empty: function() {   
  14.         // Remove element nodes and prevent memory leaks   
  15.         jQuery(this).children().remove();   
  16.   
  17.         // Remove any remaining nodes   
  18.         while ( this.firstChild )   
  19.             this.removeChild( this.firstChild );   
  20.     }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值