查詢一個節點是不是另外一個節點的後代
阿新 • • 發佈:2019-01-05
var contains=(function(){ if(typeof document.documentElement.contains){ return function(refNode,otherNode){ return refNode.contains(otherNode); } }else if(typeof document.documentElement.compareDocumentPosition){ return function(refNode,otherNode){ return !!(refNode.compareDocumentPosition(otherNode) & 16) } }else{ return function(refNode,otherNode){ var node=otherNode.parentNode; do{ if(node===refNode){ return true; }else{ return; } }while(node!==null) } } })()
三個可能性,第一個是看瀏覽時支援contains方法,如果是的話就返回函式給變數作為它的值。
第二個也是一個檢查兩者關係的DOM方法,不過它返回的是一個關係的位掩碼,
1 代表無關 2 代表給定的在參考的之前 4 給定的在參考之後 8給定的是參考的祖先 16給定的是參考的後代
我測試之後發現他會返回兩個掩碼比如說:
alert(!!(document.documentElement.compareDocumentPosition(document.body) & 16));
它返回的20 body即在HTML後面 也在是它的後代16+4等於20。 然後在進行按位與操作 和16比較 得出結果如果是非0 就說明成立了 在用兩個邏輯操作符返回布林值。
第三個就是兩個方法都不支援,用迴圈來一級一級的查詢。