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