實現(xiàn)一個jQuery的API

某統(tǒng)計網(wǎng)站的數(shù)據(jù)統(tǒng)計 赘来,使用jQuery的比例占70%左右现喳。我們來看看jQuery 到底做了哪些事情,給開發(fā)者帶來多么大的方便犬辰,能得到這么多的喜愛呢嗦篱?

探索一下jQuery內(nèi)部到底做了什么?

 <div class="" id="sss">選項1</div>
 <div class="" id="sss">選項2</div>
 <div class="" id="sss">選項3</div>
 <div class="" id="sss">選項4</div>
 <div class="" id="sss">選項5</div>
.red{
  color: red;
}
window.jQuery = function (nodeOrSelector) {
    var nodes = {}
    if (typeof nodeOrSelector === 'string') {
        let temp = document.querySelectorAll(nodeOrSelector)

        for (let i = 0; i < temp.length; i++) {
            nodes[i] = temp[i]
        }
        nodes.length = temp.length
        console.log(nodes)//得到一個純凈的原型鏈

    } else {
        if (nodeOrSelector instanceof Node) {
            nodes = {
                0: nodeOrSelector,
                length: 1
            }
        }
    }


    nodes.addClass = function (value) {
        for (let i = 0; i < nodes.length; i++) {
            nodes[i].classList.add(value)
        }
    }
   

    nodes.setText = function (text) {
        var texts = []
        if (text === undefined) {
            console.log(nodes)
            for (let i = 0; i < nodes.length; i++) {

                texts.push(nodes[i].textContent)
            }
            console.log(texts)
            return texts
        } else {
            for (let i = 0; i < nodes.length; i++) {
                console.log(nodes[i])
                nodes[i].textContent = text
            }
        }
    }
    return nodes
}

window.$ = jQuery

var $div = $('div')
$div.addClass('red') // 可將所有 div 的 class 添加一個 red
$div.setText() // 可將所有 div 的 textContent 變?yōu)閔i hi

首先我們知道 window.$= jQuery幌缝,這表明 $就是jQuery
一般來說灸促,怎么使用jQuery獲取元素 ,回想一下有哪些常用的方式呢涵卵?

  1. 獲取ul 的子級li元素
$('ul>li')   
  1. 獲取所有的<div>元素
$('div')

3.獲取id為item3的元素

 $(item3)
  1. 獲取class為xx的元素
$('.xx')

首先寫獲取的元素浴栽,一定要搞清楚 獲取的元素的性質(zhì)和各自的特點。
$(item2) 轿偎,傳入的參數(shù) item2 是一個元素的id典鸡,就代表一個node 節(jié)點
其中id選擇器獲取的元素只有一個, 因為 id 是唯一的坏晦。
除此之外萝玷,像class,html中可以有相同的class名昆婿,和標(biāo)簽球碉,不唯一。

上述代碼中仓蛆,html 代碼中多個<div>
獲取div , 獲取的是多個元素睁冬, 所以用document.querySelectorAll()

nodeOrSelector instanceof Node
$(item2), item2 代表的元素是Node 構(gòu)造函數(shù)構(gòu)造的,也說明只傳入了一個節(jié)點看疙。

nodes是偽數(shù)組時豆拨,最好后面返回的數(shù)據(jù)也是偽數(shù)組(對象)的形式。

對比jQuery 獲取文本時狼荞, 當(dāng)text() 傳入?yún)?shù)辽装, 則是設(shè)置元素的文本
不傳參帮碰,就是獲取元素的文本內(nèi)容
對于兩種形式相味, 都存在,才能保證與jQuery本身的方法一致殉挽。
所以需要判斷 傳入的參數(shù)是否 為undefined
undefined 就是指傳入的參數(shù)名已存在丰涉, 但是沒賦值的一種判斷。

如果 $div.addClass('red')傳入的參數(shù)是 字符串斯碌, 就直接傳入一死。
當(dāng) $div.addClass(['red','yellow']) ,參數(shù)是一個數(shù)組傻唾,就必須遍歷數(shù)組投慈,array.forEach(function(){})將每一個class樣式傳給每一個元素承耿。

確定一下主題, 我們平常用到的jQuery 伪煤,相比js而言加袋, 不用寫一長串的API獲取元素, 使用更加簡潔抱既。但是了解內(nèi)部以后职烧, 會知道原來jQuery在我們執(zhí)行獲取時, 其實內(nèi)部調(diào)用了很多方法防泵, 獲取到元素

那么 經(jīng)過事先一個jQuery部分功能的API , 我們知道jQuery在自己要獲取一個或多個元素時蚀之, 內(nèi)部就會自動去查找符合條件的元素返回。當(dāng)使用jQuery方法時捷泞, jQuery會找到j(luò)Query對象的方法足删, 執(zhí)行相關(guān)操作。

jQuery 本質(zhì)就是一個構(gòu)造函數(shù)锁右, 接收一個參數(shù)壹堰, 參數(shù)可能是節(jié)點或者是選擇器, 返回一個方法對象去操作節(jié)點骡湖。

在輕松簡單表象的背后贱纠,jQuery得到的青睞也是付出了努力的不是嗎?哈哈end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末响蕴,一起剝皮案震驚了整個濱河市谆焊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌浦夷,老刑警劉巖辖试,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異劈狐,居然都是意外死亡罐孝,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門肥缔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來莲兢,“玉大人,你說我怎么就攤上這事续膳「耐В” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵坟岔,是天一觀的道長谒兄。 經(jīng)常有香客問我,道長社付,這世上最難降的妖魔是什么承疲? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任邻耕,我火速辦了婚禮,結(jié)果婚禮上燕鸽,老公的妹妹穿的比我還像新娘赊豌。我一直安慰自己,他們只是感情好绵咱,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布碘饼。 她就那樣靜靜地躺著,像睡著了一般悲伶。 火紅的嫁衣襯著肌膚如雪艾恼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天麸锉,我揣著相機(jī)與錄音钠绍,去河邊找鬼。 笑死花沉,一個胖子當(dāng)著我的面吹牛柳爽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播碱屁,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼磷脯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了娩脾?” 一聲冷哼從身側(cè)響起赵誓,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎柿赊,沒想到半個月后俩功,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡碰声,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年诡蜓,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胰挑。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡蔓罚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出洽腺,到底是詐尸還是另有隱情脚粟,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布蘸朋,位于F島的核電站,受9級特大地震影響扣唱,放射性物質(zhì)發(fā)生泄漏藕坯。R本人自食惡果不足惜团南,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望炼彪。 院中可真熱鬧吐根,春花似錦、人聲如沸辐马。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喜爷。三九已至冗疮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間檩帐,已是汗流浹背术幔。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留湃密,地道東北人诅挑。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像泛源,于是被迫代替她去往敵國和親拔妥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 一达箍、樣式篇 第1章 初識jQuery (1)環(huán)境搭建 進(jìn)入官方網(wǎng)站獲取最新的版本 http://jquery.co...
    凜0_0閱讀 3,354評論 0 44
  • 1.通過在window.jQuery上添加一個函數(shù)聲明命名空間毒嫡,從而防止全局變量的產(chǎn)生。 考慮到用戶可能傳入的是一...
    鋼筆與橡皮閱讀 193評論 0 0
  • 思路 判斷傳入的參數(shù)類型幻梯,選擇器則選取對應(yīng)全部元素兜畸,元素則放入偽數(shù)組 通過DOM操作,實現(xiàn)添加class與修改內(nèi)容
    張镕凡閱讀 397評論 0 51
  • 前段時間碘梢,有條褲子舊了咬摇,丟棄前,我拆下后口袋上的一枚黑色扣子煞躬,這是三年前奶奶給我綴上的肛鹏,我記得特別清晰,是我穿...
    旋凱少年閱讀 316評論 0 0
  • 前言: 今天在知乎上看到一個問題: 來自:高中生 高中生如何讓自己去主動學(xué)習(xí)? 說真的恩沛,自己的孩子在扰,沒能養(yǎng)成好的生...
    淺影科技閱讀 608評論 0 4