一文詳解Node.contain?函數(shù)兼容處理
前言
好久不寫文章了,都不知道跟大家怎么打招呼了,新的一年開始,也應(yīng)該收心,做一些文字的記錄以及分享了。
先說下寫這篇文章的由來吧,接到一個(gè)需求需要在項(xiàng)目中實(shí)現(xiàn)一個(gè)效果,就是點(diǎn)擊其他區(qū)域隱藏dom的操作,試了很多的方式,感覺都不是特別合理,所以針對當(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
要測試的節(jié)點(diǎn)。
備注: otherNode 不是可選的,但是可以設(shè)置為 null。
返回一個(gè)布爾值,如果 otherNode 包含在節(jié)點(diǎn)中會(huì)返回 true,否則返回 false。
如果 otherNode 參數(shù)為 null,則 contains() 始終返回 false。
下面的函數(shù)用來檢查一個(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)槭窃椒?,兼容性有限,所以針對公司的?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è)檢測節(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)在各種瀏覽器中兼容檢測節(jié)點(diǎn)是否存在于指定容器中的功能。
總結(jié)
方法整體的實(shí)現(xiàn)難度不是很大,就是針對當(dāng)前原生方法的不支持的內(nèi)容進(jìn)行補(bǔ)充,
以上就是一文詳解Node.contain 函數(shù)兼容處理的詳細(xì)內(nèi)容,更多關(guān)于Node.contain 函數(shù)兼容的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
nodejs 生成和導(dǎo)出 word的實(shí)例代碼
前段時(shí)間由于項(xiàng)目需求,得做excel和word的導(dǎo)出功能.這篇文章主要介紹了nodejs 生成和導(dǎo)出 word的實(shí)例代碼,需要的朋友可以參考下2018-07-07
nodejs中向HTTP響應(yīng)傳送進(jìn)程的輸出
這篇文章主要介紹了nodejs中向HTTP響應(yīng)傳送進(jìn)程的輸出 ,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03
5分鐘教你用nodeJS手寫一個(gè)mock數(shù)據(jù)服務(wù)器的方法
這篇文章主要介紹了5分鐘教你用nodeJS手寫一個(gè)mock數(shù)據(jù)服務(wù)器的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
配置node服務(wù)器并且鏈接微信公眾號(hào)接口配置步驟詳解
這篇文章主要介紹了配置node服務(wù)器并且鏈接微信公眾號(hào)接口配置步驟詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下2019-06-06
nodejs中函數(shù)的調(diào)用實(shí)例詳解
本文通過實(shí)例代碼給大家介紹了nodejs函數(shù)的調(diào)用,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10
node.js中express中間件body-parser的介紹與用法詳解
這篇文章主要給大家介紹了關(guān)于node.js中express中間件body-parser的相關(guān)資料,文章通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-05-05
利用nginx + node在阿里云部署https的步驟詳解
這篇文章主要給大家介紹了關(guān)于利用nginx + node在阿里云部署https的步驟,文中通過圖文及示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
Windows 系統(tǒng)下安裝和部署Egret的開發(fā)環(huán)境
Egret基于TypeScript開發(fā)的,而TypeScript編譯工具tsc是基于Node.js 開發(fā)的。所以在安裝過程中,我們先需要對于基礎(chǔ)支持工具進(jìn)行安裝。2014-07-07
Node.js使用Sharp.js進(jìn)行圖像處理的實(shí)踐與技巧
Sharp.js 是一個(gè)高性能的 Node.js 圖像處理庫,基于 C 語言編寫的 libvips 庫封裝而來,提供了便捷、高效的圖片編輯與轉(zhuǎn)換功能,以下是對 Sharp.js 的深入解析,包括全方位實(shí)踐與技巧,需要的朋友可以參考下2024-08-08

