問題:已知一個元素的類名是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!遞歸