原生JavaScript如何解決父元素查找指定類名的子元素的問題

問題:已知一個元素的類名是right而且這個元素的祖先元素的類名爲parent,如今想經過原生JavaScript得到這個類名爲right的元素。html

個人思路:利用遞歸。先判斷已知的祖先元素(題中的parent)是否是要找的目標元素(題中的right),若是是,則返回這個元素。不然,繼續查找這個祖先元素的子元素,並對子元素進行遞歸,直到找到目標元素。node

下面是代碼:數組

htmldom

 <div class="parent">
    <div class="left">
        <img src="" alt="">
        <p>段落</p>
    </div>
    <div class="right">
        <div class="intro">
            <h1>標題</h1>
        </div>
    </div>
    <p>另外一個標題</p>
</div>

jsspa

 //將NodeList轉換成Array
    function transformList(list) {
        var arr = [];
        for(var i = 0; i < list.length; i++) {
            arr.push(list[i]);
        }
        return arr;
    }
    //查找一個父節點下指定類名的子節點
    function getParentdElement(parentNode, childName) {
        //若是父節點parentNode含有指定類名childName,這個節點就是目標節點
        if (parentNode.className.search(childName) !== -1) {
            console.log("if------");
            console.log(parentNode);
            return parentNode;
        } else {
            //父節點不含有指定類名childName,遞歸查找它的子節點。
            var nodes = parentNode.childNodes;
            //將子節點的list轉換成標準數組而且過濾掉Text元素
            nodes = transformList(nodes).filter(function(item){
                if(item.nodeType !== 3) {
                    return item;
                } else{ }
            });
            //若是子節點數組中有值,則遞歸查找
            if(nodes.length) {
                nodes.forEach(function(item) {
                    getParentdElement(item, childName);
                });
            }
            console.log("else------");
            console.log(nodes);
        }
    }
    console.log(getParentdElement(document.querySelector(".parent"), "right"))

結果:code

我感到很奇怪的是:在第六行"if--------"下面的輸出'<div class="right">...</div>'就是我想要的結果,也就是上面js代碼的"return parentNode",按理來講,代碼到此應該結束了,爲何後面有繼續執行了呢?我想這和我在遞歸裏面用了forEach循環有關,可是我又不清楚具體是由於什麼沒有中止代碼執行。因而我想到了第二種方案,就是把這個dom當作一棵多叉樹,利用遞歸把樹的節點放到棧或者數組裏面,而後在對數組就行操做。orm

雖然想到了其餘方法,可是我仍是想知道這種思路是否是可行,或者是我想複雜了,有沒有其餘更簡單的方法?htm

昨天晚上回去又作了一下,發現是我傻了,把問題想的複雜了,一直這樣用document.querySelector(「」),不知道也能夠寫成document.querySelector(「」).querySelector(「」).querySelector(「」)...,因此昨天下午爲了一個很小的問題繞了很大的圈子。實在不該該。可是若是不單單針對具體場景,單單想去這樣實現,我想仍是有必要須要再去研究一下。blog

fighting!遞歸

相關文章
相關標籤/搜索