jquery index()方法源碼解析

平時工作中褒傅,相信很多小伙伴跟我一樣捧存,jquery的index()方法用的很多粪躬,也用得很爽,一直都覺得不可思議昔穴。今天就偶然想了解一下它的實現原理镰官,便翻起了jquery的源碼,窺得了它大致的實現原理吗货。

場景重現:(jquery自行引入)

html:

<ul id="test">
    <li id="t1">1</li>
    <li id="t2">2</li>
    <li id="t3">3</li>
</ul>

js:

$("#test").on('click', 'li', function(e) {
    console.log($(this).index());
})

就如此小的一個demo泳唠,引發(fā)了我對index()方法的種種聯想,為什么點擊當前的元素可以知道它的索引呢宙搬?難道要預先知道它的父級嗎笨腥,這不可能,這些dom節(jié)點又不是固定的勇垛,那到底脖母。。闲孤。谆级。。崭放。

下面就開啟源碼之旅吧哨苛。

首先是index()方法鸽凶,其源碼如下:

index: function( elem ) {
    // No argument, return index in parent
    if ( !elem ) {
        return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
    }
    // Index in selector
    if ( typeof elem === "string" ) {
        return indexOf.call( jQuery( elem ), this[ 0 ] );
    }
    // Locate the position of the desired element
    return indexOf.call( this,
        // If it receives a jQuery object, the first element is used
        elem.jquery ? elem[ 0 ] : elem
    );
}

源碼很精簡币砂,而且我們只想看沒傳參時的index方法的用法,所以只看這句:

if ( !elem ) {
    return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
}

其實這句的重點在prevAll方法玻侥,其它都是些使邏輯嚴謹的代碼决摧,因此我們側重點放在prevAll方法。所以,翻看了prevAll方法:

jQuery.each({
    // ...此處省略了很多非相關代碼
    prevAll: function( elem ) {
      return dir( elem, "previousSibling" );
    },
}, function(name, fn) { // ...省略 })

緊接著掌桩,我們看dir源碼:

function dir( elem, dir, until ) {
    var matched = [],
        truncate = until !== undefined;

    while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
        if ( elem.nodeType === 1 ) {
            if ( truncate && jQuery( elem ).is( until ) ) {
                break;
            }
            matched.push( elem );
        }
    }
    return matched;
}

看到這里边锁,其實大致思路已經知道了:遍歷查找當前元素的上一個同級元素,形成一個包含所有該元素的前面的元素的集合波岛∶┨常可能有點拗口,回到我們的小demo则拷,在控制臺模擬一下prevAll的過程贡蓖,看著以下截圖應該好理解些:


控制臺模擬

而dir函數已經為我們過濾了文本節(jié)點:

if ( elem.nodeType === 1 )

最終就是返回一個所有的前面元素的集合給我們了,然后index就是prevAll().length(該集合的長度)了煌茬。

ps: 可能細心的小伙伴會發(fā)現有漏洞斥铺,index源碼上是這樣的:

if ( !elem ) {
    return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
}

人家的prevAll明明沒傳參數,那按道理prevAll就接收不到elem參數坛善,則elem為undefined晾蜘,那就沒有后續(xù)的故事情節(jié)了。關于這個眠屎,我只想說剔交,你知道得太多了。组力。省容。。燎字。腥椒。


xx

由于本人精力有限,所以只能猜想是jQuery.each方法做了手腳候衍,使得不傳參的prevAll里面的elem自動變?yōu)閠his對象笼蛛。(當然這只是本人猜想),希望有知道的留言一下蛉鹿,共勉滨砍,謝謝大家。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末妖异,一起剝皮案震驚了整個濱河市惋戏,隨后出現的幾起案子,更是在濱河造成了極大的恐慌他膳,老刑警劉巖响逢,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異棕孙,居然都是意外死亡舔亭,警方通過查閱死者的電腦和手機些膨,發(fā)現死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钦铺,“玉大人订雾,你說我怎么就攤上這事∶矗” “怎么了洼哎?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沼本。 經常有香客問我谱净,道長,這世上最難降的妖魔是什么擅威? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任壕探,我火速辦了婚禮,結果婚禮上郊丛,老公的妹妹穿的比我還像新娘李请。我一直安慰自己,他們只是感情好厉熟,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布导盅。 她就那樣靜靜地躺著,像睡著了一般揍瑟。 火紅的嫁衣襯著肌膚如雪白翻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天绢片,我揣著相機與錄音滤馍,去河邊找鬼。 笑死底循,一個胖子當著我的面吹牛巢株,可吹牛的內容都是我干的。 我是一名探鬼主播熙涤,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼阁苞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了祠挫?” 一聲冷哼從身側響起那槽,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎等舔,沒想到半個月后骚灸,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡软瞎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年逢唤,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涤浇。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡鳖藕,死狀恐怖,靈堂內的尸體忽然破棺而出只锭,到底是詐尸還是另有隱情著恩,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布蜻展,位于F島的核電站喉誊,受9級特大地震影響,放射性物質發(fā)生泄漏纵顾。R本人自食惡果不足惜伍茄,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望施逾。 院中可真熱鬧敷矫,春花似錦、人聲如沸汉额。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蠕搜。三九已至怎茫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間妓灌,已是汗流浹背轨蛤。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留虫埂,地道東北人俱萍。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像告丢,于是被迫代替她去往敵國和親枪蘑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345