您好,登錄后才能下訂單哦!
這篇文章主要介紹“javascrip高級前端開發常用的API有哪些”,在日常操作中,相信很多人在javascrip高級前端開發常用的API有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”javascrip高級前端開發常用的API有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
MutationObserver 是一個可以監聽 DOM 結構變化的接口。
當 DOM 對象樹發生任何變動時,MutationObserver 會得到通知。
MutationObserver 是一個構造器,接受一個 callback 參數,用來處理節點變化的回調函數,返回兩個參數:
mutations
:節點變化記錄列表(sequence<MutationRecord>)
observer
:構造 MutationObserver 對象。
MutationObserver 對象有三個方法,分別如下:
observe
:設置觀察目標,接受兩個參數,target:觀察目標,options:通過對象成員來設置觀察選項
disconnect
:阻止觀察者觀察任何改變
takeRecords
:清空記錄隊列并返回里面的內容
//選擇一個需要觀察的節點 var targetNode = document.getElementById('root') // 設置observer的配置選項 var config = { attributes: true, childList: true, subtree: true } // 當節點發生變化時的需要執行的函數 var callback = function (mutationsList, observer) { for (var mutation of mutationsList) { if (mutation.type == 'childList') { console.log('A child node has been added or removed.') } else if (mutation.type == 'attributes') { console.log('The ' + mutation.attributeName + ' attribute was modified.') } } } // 創建一個observer示例與回調函數相關聯 var observer = new MutationObserver(callback) //使用配置文件對目標節點進行觀測 observer.observe(targetNode, config) // 停止觀測 observer.disconnect()
observe 方法中 options 參數有已下幾個選項:
childList
:設置 true,表示觀察目標子節點的變化,比如添加或者刪除目標子節點,不包括修改子節點以及子節點后代的變化
attributes
:設置 true,表示觀察目標屬性的改變
characterData
:設置 true,表示觀察目標數據的改變
subtree
:設置為 true,目標以及目標的后代改變都會觀察
attributeOldValue
:如果屬性為 true 或者省略,則相當于設置為 true,表示需要記錄改變前的目標屬性值,設置了 attributeOldValue 可以省略 attributes 設置
characterDataOldValue
:如果 characterData 為 true 或省略,則相當于設置為 true,表示需要記錄改變之前的目標數據,設置了 characterDataOldValue 可以省略 characterData 設置
attributeFilter
:如果不是所有的屬性改變都需要被觀察,并且 attributes 設置為 true 或者被忽略,那么設置一個需要觀察的屬性本地名稱(不需要命名空間)的列表
MutationObserver 有以下特點:
它等待所有腳本任務完成后才會運行,即采用異步方式
它把 DOM 變動記錄封裝成一個數組進行處理,而不是一條條地個別處理 DOM 變動。
它即可以觀察發生在 DOM 節點的所有變動,也可以觀察某一類變動
當 DOM 發生變動會觸發 MutationObserver 事件。但是,它與事件有一個本質不同:事件是同步觸發,也就是說 DOM 發生變動立刻會觸發相應的事件;MutationObserver 則是異步觸發,DOM 發生變動以后,并不會馬上觸發,而是要等到當前所有 DOM 操作都結束后才觸發。
舉例來說,如果在文檔中連續插入 1000 個段落(p 元素),會連續觸發 1000 個插入事件,執行每個事件的回調函數,這很可能造成瀏覽器的卡頓;而 MutationObserver 完全不同,只在 1000 個段落都插入結束后才會觸發,而且只觸發一次,這樣較少了 DOM 的頻繁變動,大大有利于性能。
網頁開發時,常常需要了解某個元素是否進入了"視口"(viewport),即用戶能不能看到它。
傳統的實現方法是,監聽到 scroll 事件后,調用目標元素的 getBoundingClientRect()方法,得到它對應于視口左上角的坐標,再判斷是否在視口之內。這種方法的缺點是,由于 scroll 事件密集發生,計算量很大,容易造成性能問題。
目前有一個新的 IntersectionObserver API,可以自動"觀察"元素是否可見,Chrome 51+ 已經支持。由于可見(visible)的本質是,目標元素與視口產生一個交叉區,所以這個 API 叫做"交叉觀察器"。
IntersectionObserver 是瀏覽器原生提供的構造函數,接受兩個參數:callback 是可見性變化時的回調函數,option 是配置對象(該參數可選)。
var io = new IntersectionObserver(callback, option) // 開始觀察 io.observe(document.getElementById('example')) // 停止觀察 io.unobserve(element) // 關閉觀察器 io.disconnect()
如果要觀察多個節點,就要多次調用這個方法。
io.observe(elementA) io.observe(elementB)
目標元素的可見性變化時,就會調用觀察器的回調函數 callback。callback 一般會觸發兩次。一次是目標元素剛剛進入視口(開始可見),另一次是完全離開視口(開始不可見)。
var io = new IntersectionObserver((entries) => { console.log(entries) })
callback 函數的參數(entries)是一個數組,每個成員都是一個 IntersectionObserverEntry 對象。舉例來說,如果同時有兩個被觀察的對象的可見性發生變化,entries 數組就會有兩個成員。
time
:可見性發生變化的時間,是一個高精度時間戳,單位為毫秒
target
:被觀察的目標元素,是一個 DOM 節點對象
isIntersecting
: 目標是否可見
rootBounds
:根元素的矩形區域的信息,getBoundingClientRect()方法的返回值,如果沒有根元素(即直接相對于視口滾動),則返回 null
boundingClientRect
:目標元素的矩形區域的信息
intersectionRect
:目標元素與視口(或根元素)的交叉區域的信息
intersectionRatio
:目標元素的可見比例,即 intersectionRect 占 boundingClientRect 的比例,完全可見時為 1,完全不可見時小于等于 0
<html lang="en"> <head> <meta charset="UTF-8" /> <title>Document</title> <style> #div1 { position: sticky; top: 0; height: 50px; line-height: 50px; text-align: center; background: black; color: #ffffff; font-size: 18px; } </style> </head> <body> <div id="div1">首頁</div> <div ></div> <div id="div2" ></div> <script> var div2 = document.getElementById('div2') let observer = new IntersectionObserver( function (entries) { entries.forEach(function (element, index) { console.log(element) if (element.isIntersecting) { div1.innerText = '我出來了' } else { div1.innerText = '首頁' } }) }, { root: null, threshold: [0, 1] } ) observer.observe(div2) </script> </body> </html>
相比于 getBoundingClientRect,它的優點是不會引起重繪回流。
圖片懶加載的原理主要是判斷當前圖片是否到了可視區域這一核心邏輯實現的。這樣可以節省帶寬,提高網頁性能。傳統的突破懶加載是通過監聽 scroll 事件實現的,但是 scroll 事件會在很短的時間內觸發很多次,嚴重影響頁面性能。為提高頁面性能,我們可以使用 IntersectionObserver 來實現圖片懶加載。
const imgs = document.querySelectorAll('img[data-src]') const config = { rootMargin: '0px', threshold: 0 } let observer = new IntersectionObserver((entries, self) => { entries.forEach((entry) => { if (entry.isIntersecting) { let img = entry.target let src = img.dataset.src if (src) { img.src = src img.removeAttribute('data-src') } // 解除觀察 self.unobserve(entry.target) } }) }, config) imgs.forEach((image) => { observer.observe(image) })
無限滾動(infinite scroll)的實現也很簡單。
var intersectionObserver = new IntersectionObserver(function (entries) { // 如果不可見,就返回 if (entries[0].intersectionRatio <= 0) return loadItems(10) console.log('Loaded new items') }) // 開始觀察 intersectionObserver.observe(document.querySelector('.scrollerFooter'))
DOM2 Style 在 document.defaultView
上增加了 getComputedStyle()方法,該方法返回一個 CSSStyleDeclaration
對象(與 style 屬性的類型一樣),包含元素的計算樣式。
document.defaultView.getComputedStyle(element[,pseudo-element]) // or window.getComputedStyle(element[,pseudo-element])
這個方法接收兩個參數:要取得計算樣式的元素和偽元素字符串(如":after")。如果不需要查詢偽元素,則第二個參數可以傳 null。
<!DOCTYPE html> <html> <head> <style type="text/css"> #myDiv { background-color: blue; width: 100px; height: 200px; } </style> </head> <body> <div id="myDiv" ></div> </body> <script> function getStyleByAttr(obj, name) { return window.getComputedStyle ? window.getComputedStyle(obj, null)[name] : obj.currentStyle[name] } let node = document.getElementById('myDiv') console.log(getStyleByAttr(node, 'backgroundColor')) console.log(getStyleByAttr(node, 'width')) console.log(getStyleByAttr(node, 'height')) console.log(getStyleByAttr(node, 'border')) </script> </html>
getComputedStyle 和 element.style 的相同點就是二者返回的都是 CSSStyleDeclaration 對象。而不同點就是:
element.style 讀取的只是元素的內聯樣式,即寫在元素的 style 屬性上的樣式;而 getComputedStyle 讀取的樣式是最終樣式,包括了內聯樣式、嵌入樣式和外部樣式。
element.style 既支持讀也支持寫,我們通過 element.style 即可改寫元素的樣式。而 getComputedStyle 僅支持讀并不支持寫入。我們可以通過使用 getComputedStyle 讀取樣式,通過 element.style 修改樣式
getBoundingClientRect() 方法返回元素的大小及其相對于視口的位置。
let DOMRect = object.getBoundingClientRect()
它的返回值是一個 DOMRect 對象,這個對象是由該元素的 getClientRects() 方法返回的一組矩形的集合,就是該元素的 CSS 邊框大小。
返回的結果是包含完整元素的最小矩形,并且擁有 left, top, right, bottom, x, y, width, 和 height 這幾個以像素為單位的只讀屬性用于描述整個邊框。除了 width 和 height 以外的屬性是相對于視圖窗口的左上角來計算的。
以前的寫法是通過 offsetParent 找到元素到定位父級元素,直至遞歸到頂級元素 body 或 html。
// 獲取dom元素相對于網頁左上角定位的距離 function offset(el) { var top = 0 var left = 0 do { top += el.offsetTop left += el.offsetLeft } while ((el = el.offsetParent)) // 存在兼容性問題,需要兼容 return { top: top, left: left } } var odiv = document.getElementsByClassName('markdown-body') offset(a[0]) // {top: 271, left: 136}
現在根據 getBoundingClientRect 這個 api,可以寫成這樣:
var positionX = this.getBoundingClientRect().left + document.documentElement.scrollLeft var positionY = this.getBoundingClientRect().top + document.documentElement.scrollTop
function isElView(el) { var top = el.getBoundingClientRect().top // 元素頂端到可見區域頂端的距離 var bottom = el.getBoundingClientRect().bottom // 元素底部端到可見區域頂端的距離 var se = document.documentElement.clientHeight // 瀏覽器可見區域高度。 if (top < se && bottom > 0) { return true } else if (top >= se || bottom <= 0) { // 不可見 } return false }
到此,關于“javascrip高級前端開發常用的API有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。