原生JS模擬出jquery的find()方法(簡單遞歸)

jQuery中的find()函數可以在給定的父元素中,獲得當前父元素下指定的子元素集合潘飘。
關于find()的具體使用就不細說了肮之,重點是如何使用原生JS來實現一樣的功能。

當時想的方法是用遞歸來完成DOM樹的遍歷卜录。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <div class="carousel" id="id_carousel">
        <ul class="img-ct">
            <li id="0">
                <a href="#">
                    <p>p0</p>
                </a>
            </li>
            <li id="1">
                <a href="#">
                    <p>p1</p>
                </a>
            </li>
        </ul>
    </div>
    <script>
        function findRecursion(parent, label) {
            for (var i = 0; i < parent.children.length; i++) {
                console.log(parent.children[i]);
                findRecursion(parent.children[i], label);
            }
        }
        /*
        ul.img-ct {compact: false, type: "", title: "", lang: "", translate: true, …}
        li#0 {value: 0, type: "", title: "", lang: "", translate: true, …}
        a {target: "", download: "", ping: "", rel: "", relList: DOMTokenList(0), …}
        p {align: "", title: "", lang: "", translate: true, dir: "", …}
        li#1 {value: 0, type: "", title: "", lang: "", translate: true, …}
        a {target: "", download: "", ping: "", rel: "", relList: DOMTokenList(0), …}
        p {align: "", title: "", lang: "", translate: true, dir: "", …}
        */
    </script>
</body>
</html>

其實自己對遞歸不是很熟練(科班出身學過算法的優(yōu)勢馬上體現出來了有沒有8昵堋),了解也不是很深刻艰毒,以至于當時寫出來甚至都不知道如何運行的筐高,后面一步一步打斷點運行后才了解,也知道了為什么jQuery中find()的源碼沒有使用這種方法來遍歷DOM。

調試界面

可以看到在調用堆棧中柑土,有5個findRecursion()函數在堆棧內執(zhí)行蜀肘,此時遍歷DOM深度是遍歷到第一個li元素內的p元素上。由于p本身沒有后代元素(children.length=0)稽屏,不會再繼續(xù)調用函數遞歸下去幌缝,執(zhí)行棧彈出函數,i自增......直到碰到下一個children.length>1的元素诫欠,繼續(xù)遍歷下去涵卵。

實際上,節(jié)點中每存在一個后代節(jié)點荒叼,就會執(zhí)行一次函數轿偎,如果元素節(jié)點很多很深,很容易造成棧溢出被廓。

        <ul class="img-ct">
            <li id="0">
                <a href="#">
                    <p>p0</p>
                </a>
            </li>
            <li id="1">
                <a href="#">
                    <p>p1</p>
                </a>
            </li>
        </ul>

這是優(yōu)化了一下函數坏晦,簡單模擬了find()的功能。加入class嫁乘、id昆婿、tagName參數用于對比,數組用于保存符合功能的元素蜓斧。

var result = [];
function findRecursion(parent,label) {
    for (var i = 0; i < parent.children.length; i++) {

        if (([].indexOf.call(parent.children[i].classList,label) !== -1) || parent.children[i].id === label || parent.children[i].tagName === label) {
            result.push(parent.children[i]);
        }

        findRecursion(parent.children[i], label);
    }
}

findRecursion(document.querySelectorAll(".carousel")[0],"P");   // Array(4) [p, p, p, p.p3]
console.log(result);
result = [];

findRecursion(document.querySelectorAll(".carousel")[0],"3");   // Array(1) [li#3]
console.log(result);
result = [];

findRecursion(document.querySelectorAll(".carousel")[0],"img-ct");   // Array(1) [ul.img-ct]
console.log(result);
result = [];

測試HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <div class="carousel" id="id_carousel">
        <ul class="img-ct">
            <li id="0">
                <a href="#"><p>p0</p></a>
            </li>
            <li id="1">
                <a href="#"><p>p1</p></a>
            </li>
            <li id="2">
                <a href="#"><p>p2</p></a>
            </li>
            <li id="3">
                <a href="#"><p class="p3">p3</p></a>
            </li>
        </ul>
    </div>
</body>
</html>

當然問題也有很多仓蛆,如沒有使用this,參數類型不嚴謹挎春,每執(zhí)行一次result數組要歸0等等看疙。

關于尾遞歸


待更

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市直奋,隨后出現的幾起案子能庆,更是在濱河造成了極大的恐慌,老刑警劉巖脚线,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搁胆,死亡現場離奇詭異,居然都是意外死亡邮绿,警方通過查閱死者的電腦和手機渠旁,發(fā)現死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斯碌,“玉大人一死,你說我怎么就攤上這事∩低伲” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長冠骄。 經常有香客問我伪煤,道長,這世上最難降的妖魔是什么凛辣? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任抱既,我火速辦了婚禮,結果婚禮上扁誓,老公的妹妹穿的比我還像新娘防泵。我一直安慰自己,他們只是感情好蝗敢,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布捷泞。 她就那樣靜靜地躺著,像睡著了一般寿谴。 火紅的嫁衣襯著肌膚如雪锁右。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天讶泰,我揣著相機與錄音咏瑟,去河邊找鬼。 笑死痪署,一個胖子當著我的面吹牛码泞,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼室埋,長吁一口氣:“原來是場噩夢啊……” “哼金刁!你這毒婦竟也來了?” 一聲冷哼從身側響起劈狐,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呐馆,沒想到半個月后肥缔,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡汹来,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年续膳,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片收班。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡坟岔,死狀恐怖,靈堂內的尸體忽然破棺而出摔桦,到底是詐尸還是另有隱情社付,我是刑警寧澤承疲,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站鸥咖,受9級特大地震影響燕鸽,放射性物質發(fā)生泄漏。R本人自食惡果不足惜啼辣,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一啊研、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鸥拧,春花似錦党远、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至舆声,卻和暖如春花沉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背媳握。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工碱屁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蛾找。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓娩脾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親打毛。 傳聞我的和親對象是個殘疾皇子柿赊,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內容

  • jQuery jQuery是JavaScript世界中使用最廣泛的一個庫。 jQuery這么流行幻枉,肯定是因為它解決...
    星騰_范特西閱讀 2,095評論 0 27
  • DOM創(chuàng)建節(jié)點及節(jié)點屬性 通過JavaScript可以很方便的獲取DOM節(jié)點碰声,從而進行一系列的DOM操作。但實際上...
    阿r阿r閱讀 1,015評論 0 9
  • 第1章 簡介 第2章 DOM節(jié)點的創(chuàng)建 2-1 DOM創(chuàng)建節(jié)點及節(jié)點屬性 通過JavaScript可以很方便的獲...
    mo默22閱讀 812評論 0 8
  • 憶往昔崢嶸歲月,看今朝潮起潮落椿肩,望未來任重而道遠瞻颂。 Summary As the start-up life in...
    慢慢樹閱讀 330評論 0 0
  • 牛有四個胃,在外時盡可能的吃多的草郑象,回到牛棚后再慢慢反芻贡这,重新咀嚼消化。 最近在準備考試厂榛,大一學了的高數盖矫,我忘了一...
    1路向前閱讀 246評論 0 0