[JS][jQuery]清空元素html("")、innerHTML="" 與 empty()的區別:關於內容泄露問題,jqueryinnerhtml

來源:互聯網
上載者:User

[JS][jQuery]清空元素html("")、innerHTML="" 與 empty()的區別:關於內容泄露問題,jqueryinnerhtml

清空元素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.   
  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.     }  


jquery裡使用empty()與html("")有什不同?

empty()、html("")和text("")在刪除匹配元素內內容時是一樣的。jQuery源碼中實現有所不同,但效果相同。你可以測試一下
源碼:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "www.w3.org/...al.dtd">
<html xmlns="www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>無標題文檔</title>
<script src="../scripts/jquery-1.4.2.min.js" type="text/javascript"></script>
<script>
$(function(){
$('#btnEmpty').click(function(){
$('#aim').empty();
alert("empty()");
});
$('#btnHtml').click(function(){
$('#aim').html("");
alert('html("")');
});
$('#btnText').click(function(){
$('#aim').text("");
alert('text("")');
});
});

</script>
</head>

<body>
<div id="aim">

<ul>
<li>111111111</li>
<li>222222222</li>
<li>333333333</li>
<li>444444444</li>
</ul>

</div>
<button id='btnEmpty'>empt......餘下全文>>
 
為何jQuery在輸出html代碼後下面的內容不再執行了

alert("ul").html()
目測是這句出錯了
你的意思應該是希望列印<ul>節點的innerHtml?
那麼應該是: alert($("ul").html());
還有,jquery元素和js元素請不要混用,容易出問題
$ul = $("ul).children() 這裡的 $ul是一個jquery元素
因此:$ul[i].innerHTML 最好改成 $ul[i].html()
還有,既然用jquery就要用的徹底,不要再用for迴圈了
試試jquery的 .each(),再回頭來看現在的for,是不是覺得for實在很遜?

祝你好運 :)
 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.