一文詳解Node.contain?函數(shù)兼容處理
前言
好久不寫文章了,都不知道跟大家怎么打招呼了,新的一年開始,也應(yīng)該收心,做一些文字的記錄以及分享了。
先說下寫這篇文章的由來吧,接到一個需求需要在項目中實現(xiàn)一個效果,就是點擊其他區(qū)域隱藏dom的操作,試了很多的方式,感覺都不是特別合理,所以針對當(dāng)前需求做了一個方法的實現(xiàn),使用dom
原生方法 contains
進(jìn)行判斷當(dāng)前點擊的元素是否是指定父級的子級,然后進(jìn)行判斷是否隱藏指定元素。
具體業(yè)務(wù)邏輯方法就不在這里贅述了,主要講下contains
方法。
contains方法
Node 接口的 contains()
方法返回一個布爾值,表示一個節(jié)點是否是給定節(jié)點的后代,即該節(jié)點本身、其直接子節(jié)點(childNodes)、子節(jié)點的直接子節(jié)點等。
otherNode
要測試的節(jié)點。
備注: otherNode
不是可選的,但是可以設(shè)置為 null
。
返回一個布爾值,如果 otherNode
包含在節(jié)點中會返回 true
,否則返回 false
。
如果 otherNode
參數(shù)為 null
,則 contains()
始終返回 false
。
下面的函數(shù)用來檢查一個元素是否是 body 元素的后代元素。由于 contains
會包含元素自身,而確定 body 是否包含自身不是設(shè)計 isInPage
的意圖,這種情況明確返回 false
。
function isInPage(node) { return (node === document.body) ? false : document.body.contains(node); }
Specification |
---|
DOM Standard # ref-for-dom-node-contains① |
Report problems with this compatibility data on GitHub
desktop | mobile | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | |
contains | 16Toggle history | 12Toggle history | 9Toggle history | 7Toggle history | 1.1Toggle history | 18Toggle history | 9Toggle history | 10.1Toggle history | 1Toggle history | 1.0Toggle history | 4.4Toggle history |
兼容處理
因為是原生方法,兼容性有限,所以針對公司的項目兼容需求,還需要進(jìn)行兼容處理。具體代碼如下:
const contains = (root, el) => { if (root.compareDocumentPosition) return root === el || !!(root.compareDocumentPosition(el) & 16); if (root.contains && el.nodeType === 1) { return root.contains(el) && root !== el; } while ((el = el.parentNode)) if (el === root) return true; return false; };
這段代碼實現(xiàn)了一個檢測節(jié)點是否存在于指定容器中的函數(shù)contains
,其中使用了三種不同的方式進(jìn)行判斷:
- 如果瀏覽器支持
compareDocumentPosition
方法,則直接使用該方法進(jìn)行判斷。首先判斷root
節(jié)點是否等于el
節(jié)點,如果是,則返回true
;否則,使用compareDocumentPosition
方法判斷el
節(jié)點是否在root
節(jié)點中,如果結(jié)果為16,則返回true
,否則返回false
。 - 如果瀏覽器不支持
compareDocumentPosition
方法,但支持contains
方法,則判斷el
節(jié)點是否是一個元素節(jié)點(nodeType為1),如果是,則使用contains
方法判斷el
節(jié)點是否在root
節(jié)點中,并且root
節(jié)點不等于el
節(jié)點,如果滿足,則返回true
,否則返回false
。 - 如果瀏覽器既不支持
compareDocumentPosition
方法,也不支持contains
方法,則使用while
循環(huán)遍歷el
節(jié)點的所有祖先節(jié)點,判斷是否有節(jié)點等于root
節(jié)點,如果有,則返回true
,否則返回false
。
綜合三種方式,可以實現(xiàn)在各種瀏覽器中兼容檢測節(jié)點是否存在于指定容器中的功能。
總結(jié)
方法整體的實現(xiàn)難度不是很大,就是針對當(dāng)前原生方法的不支持的內(nèi)容進(jìn)行補充,
以上就是一文詳解Node.contain 函數(shù)兼容處理的詳細(xì)內(nèi)容,更多關(guān)于Node.contain 函數(shù)兼容的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
websocket實現(xiàn)Vue?3和Node.js之間的實時消息推送
使用?WebSocket?實現(xiàn)實時消息推送是一種高效的方式,可以在客戶端和服務(wù)器之間建立長連接,實現(xiàn)低延遲的雙向通信,以下是一個簡單的示例,展示如何在前端使用?Vue?3?和后端使用?Node.js?搭建一個?WebSocket?實現(xiàn)實時消息推送的應(yīng)用2024-06-06nodejs實現(xiàn)日志讀取、日志查找及日志刷新的方法分析
這篇文章主要介紹了nodejs實現(xiàn)日志讀取、日志查找及日志刷新的方法,涉及nodejs日期時間運算、轉(zhuǎn)換及日志讀寫等相關(guān)操作技巧,需要的朋友可以參考下2019-05-05NodeJs 實現(xiàn)簡單WebSocket即時通訊的示例代碼
這篇文章主要介紹了NodeJs 實現(xiàn)簡單WebSocket即時通訊的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08詳解Node.js使用token進(jìn)行認(rèn)證的簡單示例
這篇文章主要介紹了詳解Node.js使用token進(jìn)行認(rèn)證的簡單示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05Node.js+pm2+ssh2模塊實現(xiàn)簡單的自動化部署腳本
本文將介紹如何使用Node.js和ssh2模塊實現(xiàn)一個簡單的部署腳本,將本地的項目文件上傳到遠(yuǎn)程服務(wù)器上,我們將使用dotenv模塊來管理環(huán)境變量,以及child_process模塊來執(zhí)行命令行操作2023-10-10Node.js學(xué)習(xí)之TCP/IP數(shù)據(jù)通訊(實例講解)
下面小編就為大家?guī)硪黄狽ode.js學(xué)習(xí)之TCP/IP數(shù)據(jù)通訊(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10Node.js內(nèi)置模塊events事件監(jiān)聽發(fā)射詳解
這篇文章主要為大家介紹了Node.js內(nèi)置模塊events事件監(jiān)聽發(fā)射詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02詳解nodejs實現(xiàn)本地上傳圖片并預(yù)覽功能(express4.0+)
本篇文章主要介紹了nodejs實現(xiàn)本地上傳圖片并預(yù)覽功能(express4.0+) ,具有一定的參考價值,有興趣的可以了解一下2017-06-06