jQuery源碼探索之路(5)-- $.each, .hasClass(), .addClass()等的實(shí)現(xiàn)

  1. 自己最近在學(xué)習(xí)一些JS插件的寫(xiě)法,那么當(dāng)然就繞不開(kāi)jquery闲坎,于是自己就邊學(xué)習(xí)邊模仿吊趾,寫(xiě)一個(gè)自己的jQuery
  1. 自己也是在學(xué)習(xí)過(guò)程中形帮,有問(wèn)題請(qǐng)各位指出,希望大伙能多多支持先蒋,給給star骇钦,點(diǎn)點(diǎn)贊唄,源碼github地址
Paste_Image.png
這次我們來(lái)實(shí)現(xiàn)each,hasClass,addClass,removeClass的方法竞漾。

each

其實(shí)each很簡(jiǎn)單眯搭,就是封裝了一層遍歷罷了。所以直接開(kāi)寫(xiě)

Ye.each = function(obj, callback){
  var len = obj.length,
  constructor = obj.constructor,
  i = 0;
  //obj是一個(gè)JQ對(duì)象
  if(obj.constructor == Ye){
    for(; i < len; i++){
     var v = callback.call(obj[i], i ,obj[i]);
     if(v == false) break;
    }
  }else if(isArray(obj)){
    for(; i < len; i++){
      var  v = callback.call(obj, i ,obj[i]);
      if(v == false) break;
    }
  }else{
    for(var i in obj){
      var v = callback.call(obj, i , obj[i]);
      if(v == false) break;
    }
  }
}

each傳進(jìn)來(lái)的obj分三種情況
1.一個(gè)JQ對(duì)象 2.一個(gè)數(shù)組 3.一個(gè)普通對(duì)象
對(duì)象的遍歷通過(guò)for in 來(lái)實(shí)現(xiàn)业岁。

使用.call 來(lái)調(diào)用函數(shù)鳞仙,.call傳的第一個(gè)參數(shù)是為修改函數(shù)內(nèi)部的this,后面的都是作為函數(shù)的參數(shù)。

hasClass,addClass,removeClass

這幾個(gè)方法實(shí)際上核心一樣笔时,都是獲取className,然后用正則去匹配棍好,后續(xù)再做不同的操作,先直接上代碼

Ye.prototype = {
  //省略代碼...
  
  hasClass:function(cls){
    //使用RegExp構(gòu)建正則表達(dá)式允耿,需要在轉(zhuǎn)義字符前加反斜杠借笙。字面量形式則不用
    var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
    //遍歷JQ里的DOM
    for(var i  = 0; i < this.length; i++){
      if(this[i].className.match(reg)) return true;
    }
    return false;
  },
  addClass:function(cls){
    var reg = new RegExp('\\s|^') + cls + new RegExp('\\s|$');
    for(var i =0; i < this.length; i++){
      //沒(méi)有這個(gè)類(lèi)名,則添加
      if(!this[i].className.match(reg)){
        this[i].className += " " + cls;
      }
    }
    return this;
   },
   removeClass:function(cls){
     var reg = new RegExp('\\s|^') + cls + new RegExp('\\s|$');
     for(var i = 0; i < this.length; i++){
       if(this[i].className.match(reg)){
         this[i].className.replace(cls,"");
       }
     }
     return this;
   }

  //省略代碼...

}

這里其實(shí)也很簡(jiǎn)單较锡,主要是要會(huì)運(yùn)用正則匹配表達(dá)式去查找业稼,然后利用repalce等字符串的方法去替換。
在最后的removeClass中蚂蕴,我們是將cls替換成一個(gè)空字符串低散,如果這個(gè)className前后有空格的話,我們就沒(méi)有去掉掂墓,繼續(xù)保留了谦纱,所以可能會(huì)導(dǎo)致className里有許多無(wú)用的空格看成。

想要去掉的話其實(shí)也有辦法君编,我們可以利用正則對(duì)象的$1,$2...等屬性,來(lái)得到正則匹配里子匹配獲取到的對(duì)象川慌。
從而判斷是否有空格吃嘿,進(jìn)而去把空格也替換掉祠乃,具體的可以去看正則匹配的一些介紹。

今天的方法就實(shí)現(xiàn)到這里啦兑燥。


附:
既然您看都看完了亮瓷,麻煩您點(diǎn)個(gè)贊,給個(gè)star唄降瞳,謝謝您的支持
源碼地址:https://github.com/LY550275752/my-js-plug/blob/master/Ye.js

如果您不知道我在說(shuō)什么的話嘱支,推薦您從頭開(kāi)始看我的這個(gè)系列文章:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市挣饥,隨后出現(xiàn)的幾起案子除师,更是在濱河造成了極大的恐慌,老刑警劉巖扔枫,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汛聚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡短荐,警方通過(guò)查閱死者的電腦和手機(jī)倚舀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)忍宋,“玉大人痕貌,你說(shuō)我怎么就攤上這事⊙茸伲” “怎么了芯侥?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)乳讥。 經(jīng)常有香客問(wèn)我柱查,道長(zhǎng),這世上最難降的妖魔是什么云石? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任唉工,我火速辦了婚禮,結(jié)果婚禮上汹忠,老公的妹妹穿的比我還像新娘淋硝。我一直安慰自己,他們只是感情好宽菜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布谣膳。 她就那樣靜靜地躺著,像睡著了一般铅乡。 火紅的嫁衣襯著肌膚如雪继谚。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天阵幸,我揣著相機(jī)與錄音花履,去河邊找鬼芽世。 笑死,一個(gè)胖子當(dāng)著我的面吹牛诡壁,可吹牛的內(nèi)容都是我干的济瓢。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼妹卿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼旺矾!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起夺克,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤宠漩,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后懊直,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體扒吁,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年室囊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雕崩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡融撞,死狀恐怖盼铁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情尝偎,我是刑警寧澤饶火,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站致扯,受9級(jí)特大地震影響肤寝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抖僵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一鲤看、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧耍群,春花似錦义桂、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至曹抬,卻和暖如春溉瓶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工嚷闭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赖临。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓胞锰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親兢榨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嗅榕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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

  • 第一章 jQuery簡(jiǎn)介 1-1 jQuery簡(jiǎn)介 1.簡(jiǎn)介 2.優(yōu)勢(shì) 3.特性與工具方法 1-2 環(huán)境搭建 進(jìn)入...
    mo默22閱讀 1,578評(píng)論 0 11
  • 原文鏈接 http://blog.poetries.top/2016/10/20/review-jQuery 關(guān)注...
    程序員poetry閱讀 16,636評(píng)論 18 503
  • jQuery的屬性與樣式之.attr()與.removeAttr() 每個(gè)元素都有一個(gè)或者多個(gè)特性,這些特性的用途...
    阿r阿r閱讀 653評(píng)論 0 6
  • 1.JQuery 基礎(chǔ) 改變web開(kāi)發(fā)人員創(chuàng)造搞交互性界面的方式吵聪。設(shè)計(jì)者無(wú)需花費(fèi)時(shí)間糾纏JS復(fù)雜的高級(jí)特性凌那。 1....
    LaBaby_閱讀 1,167評(píng)論 0 1
  • 若你是天后赫拉 宙斯絕不會(huì)把別的女子尋覓 你真善美的品格和那傾世的才華 天地間哪個(gè)不為你癡迷 我也把你覬覦 可惜我...
    戚北林閱讀 175評(píng)論 0 2