1. 程式人生 > >查詢一個節點是不是另外一個節點的後代

查詢一個節點是不是另外一個節點的後代

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  就說明成立了 在用兩個邏輯操作符返回布林值。

第三個就是兩個方法都不支援,用迴圈來一級一級的查詢。