jQuery之empty、remove、detach

来源:http://www.cnblogs.com/giggle/archive/2016/04/08/5370195.html
-Advertisement-
Play Games

三者都有把元素移除的作用,但細微的差別,造就了它們的使命不同。 最權威的解釋當然是jQuery_API咯,下麵是API中關於他三兒的部分截取。 This method removes not only child (and other descendant) elements, but also a ...


三者都有把元素移除的作用,但細微的差別,造就了它們的使命不同。

最權威的解釋當然是jQuery_API咯,下麵是API中關於他三兒的部分截取。

一、empty:

This method removes not only child (and other descendant) elements, but also any text within the set of matched elements. This is because, according to the DOM specification, any string of text within an element is considered a child node of that element.To avoid memory leaks, jQuery removes other constructs such as data and event handlers from the child elements before removing the elements themselves. If you want to remove elements without destroying their data or event handlers (so they can be re-added later), use .detach() instead.

註意:加粗的部分,通過empty移除後代元素,會移除其事件的。

為什麼呢?

防止記憶體泄露!!!

二、remove:

Similar to .empty(), the .remove() method takes elements out of the DOM. Use .remove() when you want to remove the element itself, as well as everything inside it. In addition to the elements themselves, all bound events and jQuery data associated with the elements are removed. To remove the elements without removing data and events, use .detach() instead.

remove和empty方法一樣,都會移除元素的事件句柄,從而避免記憶體泄露。

區別:remove包含了移除事件本身,而empty是後代元素。

三、detach:

從empty和remove的介紹中(英文斜體部分),可以或多或少得知,detach是不會移除事件句柄的。

那麼我們再來看看詳細的API講解:

The .detach() method is the same as .remove(), except that .detach() keeps all jQuery data associated with the removed elements. This method is useful when removed elements are to be reinserted into the DOM at a later time.

咦,什麼意思?

看了detach的註解,不知道大家有沒有眼前一亮,detach不能用來刪除廢棄的元素

為什麼呢?

因為它保留了事件驅動嘛,這樣不就會造成記憶體泄露麽。

所以要刪除以後不再利用的元素時,使用empty或者remove。

那要detach有何用?

用處大了。

當我們要對一個元素進行大規模的增刪改的時候,我們可以用detach將這個元素提取出來,然後在這個元素上進行操作,而不是在整個dom文檔中進行操作。

好處就是:減少對整個dom文檔的修改,從而減少頁面重繪;而且對整個dom文檔進行操作,在ie下還可能會造成記憶體泄露哦。所以穩妥起見,還是利用detach這一神器吧。

下麵是一個demo,首先對#container元素綁定click事件(事件委托),然後利用detach將其脫離文檔,然後再創建兩個child元素,追加到#container元素中,最後將#container重新添加到body後。

<!DOCTYPE html> 
    <head>
        <title>jQuery</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <style>
            div.monkey, #container {
                width:120px;
                height:120px;
                line-height:60px;
            }
            div.monkey {
                border:1px solid black;
            }            
        </style>
    </head>
    <body>
        <div class="monkey"> </div>
        <div id="container"> </div>
        <script src="jquery-1.12.0.js"></script>
        <script>
            $(function(){
                //事件代理
                $('#container').on('click',function( event ){
                    console.log( $(event.target).text() );
                });
                //利用detach將container從dom文檔中剝離開
                var container = $('#container').detach();
                var child1 = '<div>I am Monkey</div>';
                var child2 = '<div>Monkey is me</div>';
                //將child1、child2插入container中
                $(container).append( child1 )
                            .append( child2 );
                //將container重新插入body中            
                $('body').append( container );
            });    
        </script>
    </body>
</html>

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 因為JavaScript 中this 是在運行期進行綁定的,因此JavaScript 中this 關鍵字具備多重含義。 具體在實際應用中,this的指向大致可以分為下麵4種。 作為對象的方法調用 和 作為普通函數調用 註意,不管x之前是obj.getA,還是其他某個對象的屬性,只要最後是以x(),f ...
  • 新增功能 1. HTML5新標準中直接添加了擁有具體含義的HTML標簽比如:<article>、<footer>、<header>、<nav>、<section>、<video>, <progress>(進度條)、<meter>(容量占用條)、<time>(不顯示效果), <aside>(文章側欄) ...
  • 一、實現效果 1.初始化效果:未添加樣式和特效 2、添加CSS樣式 3、最終效果 二、JQuery代碼 三、完整代碼 1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title>JQuery製作導航欄 ...
  • touchstart:觸摸開始的時候觸發 touchmove:手指在屏幕上滑動的時候觸發 touchend:觸摸結束的時候觸發 而每個觸摸事件都包括了三個觸摸列表,每個列表裡包含了對應的一系列觸摸點(用來實現多點觸控): touches:當前位於屏幕上的所有手指的列表。 targetTouches: ...
  • 原文出自:http://kb.cnblogs.com/page/92320/ HTTP(HyperTextTransferProtocol)即超文本傳輸協議,目前網頁傳輸的的通用協議。HTTP協議採用了請求/響應模型,瀏覽器或其他客戶端發出請求,伺服器給與響應。就整個網路資源傳輸而言,包括messa ...
  • 看到同學找到了阿裡的這麼一個面試題,感覺挺有趣,就做了做。 用div+css做出如下效果: 當滑鼠移入帶紅色div上的時候,div的大小增大25%,其他的不變。如下圖: 詳細代碼如下: <!doctype html><html lang="en"> <head> <meta charset="UTF ...
  • 第七章 1、 樣式表:選擇器和生命塊 2、 !important: 某條聲明的重要程度比其他高,在末尾添加 3、 屬性值:inherit; 是強制繼承 4、 1em=16px; 5、 可以接受不帶單位的屬性:line-height、z-index、opacity 6、 background-colo ...
  • 【前面的話】說數組“萬能”,可能誇張了一點,但是就個人觀點,數組的運用是非常廣泛的,這裡的廣泛當然也包含了在其他語言中的運用。舉例說明,在javascript當中,由於字元串的不可變性,在進行字元串拼接等操作中,都極大的消耗了記憶體,這時候用數組來“裝載”字元串,操作簡單,又不消耗過多的記憶體,真可謂是 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...