亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JS監(jiān)聽dom高度變化幾種常用方法總結(jié)

 更新時間:2023年10月10日 09:09:35   作者:1024小神  
我們在開發(fā)中會遇到一些需求,需要監(jiān)聽元素變化,比如元素屬性變化,元素大小變化,這篇文章主要給大家介紹了關于JS監(jiān)聽dom高度變化幾種常用方法的相關資料,需要的朋友可以參考下

前言

有時候我們需要監(jiān)聽dom的變化,例如有時候圖片未加載完就取 dom 的高度,這樣會導致高度不正確,所以需要監(jiān)聽 dom 的高度變化。才能準確獲取dom的高度,那么有哪些監(jiān)聽dom高度變化的方法呢?今天簡單列舉一下。

監(jiān)聽dom樹變化DOMNodeInserted

可以用DOMNodeInserted事件監(jiān)聽子元素是否改變,但是不是很準確。

var dom = document.getElementById('dom');
var height = dom.offsetHeight;
dom.addEventListener('DOMNodeInserted', function () {
  var newHeight = dom.offsetHeight;
  if (newHeight !== height) {
    console.log('dom高度變化了');
    height = newHeight;
  }
});

MutationObserver 構造函數(shù)

Mutation Observer API 用來監(jiān)視 DOM 變動。DOM 的任何變動,比如節(jié)點的增減、屬性的變動、文本內(nèi)容的變動,這個 API 都可以得到通知。 目前來看,IE11及以上都可以兼容。兼容性還可以,可以大膽使用。

MutationObserver 構造函數(shù)的實例傳的是一個回調(diào)函數(shù),該函數(shù)接受兩個參數(shù),第一個是變動的數(shù)組,第二個是觀察器的實例。

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

MutationObserver 的應用

var haoroomsId = document.getElementById('haorooms');
var MutationObserver = window.MutationObserver || window.webkitMutationObserver || window.MozMutationObserver;
var recordHeight = 0;
var mutationObserver = new MutationObserver(function (mutations) {
  console.log(mutations);
  let height = window.getComputedStyle(haoroomsId).getPropertyValue('height');
  if (height === recordHeight) {
    return;
  }
  recordHeight = height;
  console.log('高度變化了');
  // 之后更新外部容器等操作
})
mutationObserver.observe(haoroomsId, {
  childList: true, // 子節(jié)點的變動(新增、刪除或者更改)
  attributes: true, // 屬性的變動
  characterData: true, // 節(jié)點內(nèi)容或節(jié)點文本的變動
  subtree: true // 是否將觀察器應用于該節(jié)點的所有后代節(jié)點
})

針對動畫animation、transform監(jiān)聽不到的情況,可以在動畫完成監(jiān)聽高度就可以了

  el.addEventListener('animationend', onHeightChange)
    el.addEventListener('transitionend', onHeightChange)

ResizeObserver

ResizeObserver 是新的API,處于實驗階段,因此,兼容性不太好,文檔:ResizeObserver - Web API 接口參考 | MDN

使用很簡單

// create an Observer instance
const resizeObserver = new ResizeObserver((entries) =>
  console.log('Body height changed:', entries[0].target.clientHeight)
);
// start observing a DOM node
resizeObserver.observe(document.body);

ResizeObserver Polyfill

實驗性的 API 不足,可以用 Polyfill 來彌補

ResizeObserver Polyfill 利用事件冒泡,在頂層 document 上監(jiān)聽動畫 transitionend;

監(jiān)聽 window 的 resize 事件;

其次用 MutationObserver 監(jiān)聽 document 元素;

兼容IE11以下 通過 DOMSubtreeModified 監(jiān)聽 document 元素。

/**
 * Initializes DOM listeners.
 *
 * @private
 * @returns {void}
 */
ResizeObserverController.prototype.connect_ = function () {
    // Do nothing if running in a non-browser environment or if listeners
    // have been already added.
    if (!isBrowser || this.connected_) {
        return;
    }
    // Subscription to the "Transitionend" event is used as a workaround for
    // delayed transitions. This way it's possible to capture at least the
    // final state of an element.
    document.addEventListener('transitionend', this.onTransitionEnd_);
    window.addEventListener('resize', this.refresh);
    if (mutationObserverSupported) {
        this.mutationsObserver_ = new MutationObserver(this.refresh);
        this.mutationsObserver_.observe(document, {
            attributes: true,
            childList: true,
            characterData: true,
            subtree: true
        });
    }
    else {
        document.addEventListener('DOMSubtreeModified', this.refresh);
        this.mutationEventsAdded_ = true;
    }
    this.connected_ = true;
};

小結(jié)

以上就是總結(jié)的js如何監(jiān)聽dom變化的方法,假如你不用兼容老的瀏覽器,可以用最新的ResizeObserver,當然也可以用ResizeObserver,配合Polyfill來進行。

總結(jié)

到此這篇關于JS監(jiān)聽dom高度變化方法的文章就介紹到這了,更多相關JS監(jiān)聽dom高度變化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 微信小程序?qū)崿F(xiàn)3D輪播圖效果(非swiper組件)

    微信小程序?qū)崿F(xiàn)3D輪播圖效果(非swiper組件)

    這篇文章主要為大家詳細介紹了微信小程序?qū)崿F(xiàn)3D輪播圖效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • js字符串分割處理的幾種方法(6種)

    js字符串分割處理的幾種方法(6種)

    本文主要介紹了js字符串分割處理的幾種方法,主要介紹了6種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • 純JavaScript創(chuàng)建一個簡單的待辦事項列表

    純JavaScript創(chuàng)建一個簡單的待辦事項列表

    這篇文章主要給大家介紹了關于純JavaScript創(chuàng)建一個簡單的待辦事項列表的相關資料,清單通常用于記錄我們在某一天需要完成的所有事項,將最關鍵的任務放在最上方,將最不重要的事項放在最下方,需要的朋友可以參考下
    2024-01-01
  • 原生js實現(xiàn)俄羅斯方塊

    原生js實現(xiàn)俄羅斯方塊

    這篇文章主要為大家詳細介紹了原生js實現(xiàn)俄羅斯方塊,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • JavaScript阻止回車提交表單的方法

    JavaScript阻止回車提交表單的方法

    如何防止回車(enter)鍵提交表單,其實很簡單,就一句話。onkeydown="if(event.keyCode==13)return false;"把這句寫在from標簽里面就好了
    2015-12-12
  • 從父頁面調(diào)用iframe中的JavaScript代碼的方法

    從父頁面調(diào)用iframe中的JavaScript代碼的方法

    在Web前端開發(fā)中,iframe(內(nèi)嵌框架)是一種常用的技術,用于在一個頁面中嵌入另一個HTML頁面,然而,有時候我們需要從父頁面與iframe內(nèi)的內(nèi)容進行交互,本文將詳細介紹如何從父頁面調(diào)用iframe中的JavaScript代碼,提供詳細的代碼示例和最佳實踐,需要的朋友可以參考下
    2024-11-11
  • JS數(shù)組排序方法實例分析

    JS數(shù)組排序方法實例分析

    這篇文章主要介紹了JS數(shù)組排序方法,結(jié)合實例形式分析了javascript數(shù)組冒泡排序與選擇排序原理及實現(xiàn)技巧,需要的朋友可以參考下
    2016-12-12
  • 微信小程序 自定義復選框?qū)崿F(xiàn)代碼實例

    微信小程序 自定義復選框?qū)崿F(xiàn)代碼實例

    這篇文章主要介紹了微信小程序 自定義復選框?qū)崿F(xiàn)代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • JavaScript異步編程的干貨知識點分享

    JavaScript異步編程的干貨知識點分享

    異步是什么意思?如何實現(xiàn)異步編程?不同的異步模式有哪些?本文將圍繞這些問題和大家分享JavaScript異步編程中的重要知識點,需要的可以學習一下
    2023-06-06
  • JS封裝的選項卡TAB切換效果示例

    JS封裝的選項卡TAB切換效果示例

    這篇文章主要介紹了JS封裝的選項卡TAB切換效果,結(jié)合實例形式分析了javascript響應鼠標事件動態(tài)操作頁面元素屬性實現(xiàn)tab切換的相關技巧,需要的朋友可以參考下
    2016-09-09

最新評論