探索jsmutationobserver的神奇

一、mutationobserver基礎及用途

1、mutationobserver是什麼?

var observer = new MutationObserver(callback);

mutationobserver指的是監測DOM變化的接口。可以用來監測DOM的子節點、屬性和文本變化等等。下面是一個基本的示例:

var target = document.querySelector('#some-id');
var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    console.log(mutation.type);
  });
});
 
observer.observe(target, { attributes: true, childList: true, characterData: true });

2、mutationobserver的callback

var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    console.log(mutation.type);
  });
});

使用mutationobserver需要傳入一個callback函數,當觀察到指定節點的變化時就會回調該函數。該函數的參數是一個MutationRecord對象的數組,MutationRecord對象包含了一些信息,比如打變化的類型、目標節點以及節點的舊值和新值等等,開發者可以根據自己的需求對這些信息做出相應的處理。

3、mutationobserver的用途

mutationobserver在實際開發中有很多用途,比如實時更新某個組件的狀態、監測某個元素的變化、自動設置某個元素的高度等等,可以大大提高開發效率。下面是一些應用實例:

(1)監測某個元素的變化

var targetNode = document.getElementById('target');
var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    console.log(mutation.type);
  });
});
var config = { attributes: true, childList: true, characterData: true };
observer.observe(targetNode, config);

(2)實時更新某個組件的狀態

var targetNode = document.getElementById('target');
var observer = new MutationObserver(function(mutations) {
  var statusNode = document.getElementById('status');
  statusNode.innerHTML = '狀態已更新';
});
var config = { attributes: true, childList: true, characterData: true };
observer.observe(targetNode, config);

(3)自動設置某個元素的高度

var targetNode = document.getElementById('target');
var observer = new MutationObserver(function(mutations) {
  var heightNode = document.getElementById('height');
  heightNode.innerHTML = targetNode.offsetHeight;
});
var config = { attributes: true, childList: true, characterData: true };
observer.observe(targetNode, config);

二、mutationobserver常見問題

1、mutationobserver與setTimeout的區別

mutationobserver和setTimeout都可以用來實現實時監測DOM的變化,區別是setTimeout是不停地輪詢DOM結構,而mutationobserver則只會在DOM結構發生變化後才會被觸發。setTimeout的缺點是會佔用一定的CPU資源,同時也可能會導致頁面性能下降。因此,在實現類似功能時更推薦使用mutationobserver。

2、mutationobserver的兼容性

mutationobserver是HTML5的新特性,目前主流瀏覽器均支持,IE11及以上版本也已經支持,但是低於IE11的版本不支持。因此,在兼容性上需要做出一些特別的處理。

3、mutationobserver的性能優化

在使用mutationobserver時一定要注意性能問題,因為如果DOM結構發生變化比較頻繁的話,mutationobserver就會在較短的時間內被頻繁觸發,導致性能下降。因此,開發者需要注意以下幾點:

(1)監測儘可能少的節點,因為監測節點越多,觸發mutationobserver的頻率就越高。

(2)在設置observer.observe()時,盡量避免使用默認的配置,因為默認配置下會監測DOM變化的所有屬性。所以只需要監測需要的節點即可。

(3)合理選擇callback函數中的處理方式,避免無效操作,提高代碼效率。

三、mutationobserver實際應用

1、監測某個元素的變化並更新另一個元素

<div id="target">I love javascript</div>
<div id="result"></div>
<script>
  var targetNode = document.getElementById('target');
  var resultNode = document.getElementById('result');
  var observer = new MutationObserver(function(mutations) {
    resultNode.innerHTML = targetNode.innerHTML;
  });
  var config = { attributes: true, childList: true, characterData: true };
  observer.observe(targetNode, config);
</script>

2、自動設置某個元素的高度

<div id="target">I love javascript</div>
<div id="height"></div>
<script>
  var targetNode = document.getElementById('target');
  var heightNode = document.getElementById('height');
  var observer = new MutationObserver(function(mutations) {
    heightNode.innerHTML = targetNode.offsetHeight;
  });
  var config = { attributes: false, childList: true, characterData: false };
  observer.observe(targetNode, config);
</script>

3、實時更新某個組件的狀態

<div id="target">I love javascript</div>
<div id="status"></div>
<script>
  var targetNode = document.getElementById('target');
  var statusNode = document.getElementById('status');
  var observer = new MutationObserver(function(mutations) {
    statusNode.innerHTML = '狀態已更新';
  });
  var config = { attributes: true, childList: true, characterData: true };
  observer.observe(targetNode, config);
</script>

四、如何使用mutationobserver實現數據雙向綁定

1、數據雙向綁定是什麼?

數據雙向綁定是指當一個模型(Model)的數據發生變化時,視圖(View)會做出相應的改變;反之,當用戶在視圖上進行操作時,模型中的數據也會跟着改變。

2、如何使用mutationobserver實現數據雙向綁定?

在實現數據雙向綁定時,可以使用mutationobserver來監測數據變化,實現視圖的自動更新。具體實現方法如下:

<input type="text" id="input">
<p id="result"></p>

<script>
  // 監測input的變化
  var input = document.getElementById('input');
  var observer = new MutationObserver(function(mutations) {
    mutations.forEach(function(mutation) {
      if (mutation.type === 'attributes') {
        document.getElementById('result').innerHTML = input.value;
      }
    });
  });
  observer.observe(input, { attributes: true });
  // 監測result的變化
  var result = document.getElementById('result');
  result.addEventListener('input', function() {
    input.value = result.innerHTML;
    observer.disconnect();
    // 觸發一次變化事件,通知數據更新
    var e = document.createEvent('HTMLEvents');
    e.initEvent('change', true, true);
    input.dispatchEvent(e);
    observer.observe(input, { attributes: true });
  });
</script>

實現數據雙向綁定需要注意以下幾點:

(1)需要在監測變化時進行判斷,避免死循環。

(2)需要在DOM節點發生變化時通過觸發一次change事件通知數據進行更新。

(3)在input與result的相互監測時,需要先取消mutatiionobserver的監測,然後再重新開始新的監測。

五、mutationobserver的局限性

mutationobserver雖然強大,但是也有一些局限性,需要注意。

1、mutationobserver的無法監聽CSS的變化。比如改變元素的寬度、高度、位置等屬性,都無法被mutationobserver檢測到。但是可以通過監聽resize或scroll事件的方式來實現。

2、無法檢測到通過cloneNode()操作插入的節點,節點需要完全重新渲染才能被mutationobserver檢測到。

3、無法檢測到對Text節點的修改,因為Text節點的nodeValue屬性是一個字符串,而不是一個DOM元素。

4、無法檢測到通過innerHTML進行賦值的變化,因為這種方式是直接對DOM節點進行賦值,而不是通過DOM操作進行的。

六、總結

mutationobserver作為一種強大的DOM變化監測方式,在實際開發中有着廣泛的應用。通過對它的基礎、常見問題、實際應用以及局限性等方面進行探究,我們可以更好地了解它的使用方法和注意事項,從而更好地應用它,提高開發效率。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/185811.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-26 21:07
下一篇 2024-11-26 21:07

相關推薦

  • vanta.js – 快速創建美麗而又神奇的背景效果

    Web開發中的設計是一個非常重要的環節。但是,設計並不總是好做,而且往往需要花費大量的時間和資源。vanta.js的出現,推動了設計的速度,讓你很容易地在你的網站/應用程序中快速創…

    編程 2025-04-23
  • JS中map的神奇用法

    一、map的基本用法 map是JS中的高階函數之一,它可以接受一個函數作為參數,對數組中的每個元素執行該函數,並將執行後的結果組成新的數組返回。以下是一個簡單的map示例: con…

    編程 2025-02-17
  • 668dd的神奇之處

    一、簡介 668dd是一種全能開發編程語言,它的獨特之處在於它為開發者提供了極為便捷的開發體驗。下面我們將對它的優點進行詳細的介紹。 二、易於學習 668dd使用簡單易懂的語法,沒…

    編程 2025-02-05
  • 動圖展現神奇魔方還原方法(魔方顏色對應標準)

    魔友們好! 相信很多魔方愛好者,在看到一個打亂的三階魔方的時候,都是想着要把它復原,可當看到魔方還原公式表就頭疼了,因為看不懂啊,所以很多朋友在這一步就知難而退,要麼就拆掉重組。 …

  • 探索Oh My Zsh插件的神奇世界

    Oh My Zsh是一款為zsh定製的開源框架,提供豐富的主題和插件,幫助用戶更高效和愉悅地使用終端。在本篇文章中,我們將會從多個方面對Oh My Zsh插件進行詳細的闡述。包括但…

    編程 2025-01-13
  • JS自定義屬性的神奇用途

    一、JS自定義屬性怎麼獲取 JS自定義屬性,即通過JavaScript代碼為HTML元素添加的屬性。要獲取JS自定義屬性,可以使用元素的getAttribute方法。 // HTM…

    編程 2025-01-13
  • Python exponent e的神奇威力

    一、什麼是exponent e? Exponent e指的是自然常數e,它等於2.71828….,是一種特殊的無理數,常用於數學和科學中。在Python中,我們可以使用…

    編程 2024-12-20
  • 探索神奇的圓周率平方根——Python中的pi開根

    圓周率是一個非常神奇的數值,它獨具特色的屬性在科學、數學和工程領域非常重要,對於眾多數學愛好者而言,圓周率的計算也是非常有趣的事情。其中,圓周率的平方根是一個特別神奇的數字,在Py…

    編程 2024-12-16
  • python還有這般鬼斧神工,python有那麼神奇嗎

    本文目錄一覽: 1、為什麼python內置的sort比自己寫的快速排序快100倍? 2、python3和python2差別為什麼那麼大 3、python和java哪一個比較好學?各…

    編程 2024-12-15
  • Java工程師:盡情發揮Lambda的神奇之處

    在Java 8之前,Java是一個完全面向對象編程語言,然而實現函數式編程的限制被證明是這門語言的弱點。但是,Java 8的Lambda表達式改變了這一點,這讓Java工程師們可以…

    編程 2024-12-12

發表回復

登錄後才能評論