實現一個 jQuery 的 API的思路及細節(jié)

實現一個jQuery的API功能有:

  1. 給獲取到的元素增加class
  2. 給獲取到的元素設置文本

實現思路:

  1. 大視角:根據js執(zhí)行的聲明語句男韧,判斷出window.jQuery本質其實是一個函數,封裝要實現上面功能的函數,這個函數需要接受參數,要返回一個對象,同時帶有addClass屬性和setText屬性。下面是分步實現。
  2. 在window.jQuery函數中聲明一個對象nodes别凹,這個對象中有兩個屬性,這兩個屬性的value都是函數洽糟,分別實現上面的兩個功能炉菲。
  3. 簡單的做法:當調用函數jQuery的時候,根據傳入的實參坤溃,直接提供一個解決辦法拍霜,缺點:不實用,只能針對一種情況薪介,遇到其他情況祠饺,需要重新改代碼
  4. 實用的做法:當調用函數jQuery()的時候,在函數中判斷傳遞的參數是字符串還是節(jié)點汁政,然后對不同的數據類型做出不同的處理道偷,如果傳遞的參數是字符串的話,則一定要加上nodes.length = temp.length;记劈,為了之后可以遍歷偽數組勺鸦;如果傳遞的節(jié)點是字符串的話,則返回一個偽數組抠蚣。
  5. 在對象nodes中用添加不同的屬性(函數)實現不同的功能祝旷。
  6. nodes.addClass添加了一個判斷傳進來的參數是字符串還是數組履澳,采取不同的處理方法嘶窄。
  7. 調用jQuery函數會返回對象nodes,從而可以在函數外面調用函數里面的對象中的方法

課后習題:
補全下面的代碼

window.jQuery = ???
window.$ = jQuery

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

實現代碼:

window.jQuery = function(nodeOrSelector){
  var nodes = {};
  if(typeof nodeOrSelector === 'string'){
    let temp = document.querySelectorAll(nodeOrSelector);
//     console.log(temp);
    for(let i=0;i<temp.length;i++){
      nodes[i] = temp[i];
    }
//     console.log(nodes)
    nodes.length = temp.length;
  }else if(nodeOrSelector instanceof Node){
    nodes={
      0:nodeOrSelector,
      length : 1
    }
//     console.log(nodes)
  }
  nodes.addClass = function(classes){
    //判斷傳進來的參數是字符串還是數組
    if(typeof classes === 'string'){
      for(let i=0;i<nodes.length;i++){
          nodes[i].classList.add(classes);
      }
      console.log("lalalal")
    }else if(classes instanceof Array){
      classes.forEach(value =>{
        for(let i=0;i<nodes.length;i++){
          nodes[i].classList.add(value);
        }
      })
    }  
  }
  nodes.setText = function(value){
    for(let i=0;i<nodes.length;i++){
      nodes[i].textContent = 'hi';
    }
  }
  return nodes
}
window.$ = jQuery


var $div = $('div')
$div.addClass(['yellow','green','blue']) //可將所有 div 的 class 添加數組里面的元素
$div.addClass('red') // 可將所有 div 的 class 添加一個 red
$div.setText('hi') // 可將所有 div 的 textContent 變?yōu)?hi

注:
上面實現思路的文字有點多距贷,一方面柄冲,對于我來說,梳理一下思路忠蝗,方面之后回來復習一下现横,另一方面,也能夠給別人做一個參考的例子,可以學習到不少的東西戒祠。有點自夸骇两,O(∩_∩)O哈哈~!=低千!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市馏颂,隨后出現的幾起案子示血,更是在濱河造成了極大的恐慌,老刑警劉巖救拉,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件难审,死亡現場離奇詭異,居然都是意外死亡亿絮,警方通過查閱死者的電腦和手機告喊,發(fā)現死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來派昧,“玉大人葱绒,你說我怎么就攤上這事《范В” “怎么了地淀?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長岖是。 經常有香客問我帮毁,道長,這世上最難降的妖魔是什么豺撑? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任烈疚,我火速辦了婚禮,結果婚禮上聪轿,老公的妹妹穿的比我還像新娘爷肝。我一直安慰自己,他們只是感情好陆错,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布灯抛。 她就那樣靜靜地躺著,像睡著了一般音瓷。 火紅的嫁衣襯著肌膚如雪对嚼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天绳慎,我揣著相機與錄音纵竖,去河邊找鬼漠烧。 笑死,一個胖子當著我的面吹牛靡砌,可吹牛的內容都是我干的已脓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼通殃,長吁一口氣:“原來是場噩夢啊……” “哼摆舟!你這毒婦竟也來了?” 一聲冷哼從身側響起邓了,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤恨诱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后骗炉,有當地人在樹林里發(fā)現了一具尸體照宝,經...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年句葵,在試婚紗的時候發(fā)現自己被綠了厕鹃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡乍丈,死狀恐怖剂碴,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情轻专,我是刑警寧澤忆矛,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站请垛,受9級特大地震影響催训,放射性物質發(fā)生泄漏。R本人自食惡果不足惜宗收,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一漫拭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧混稽,春花似錦采驻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至颓影,卻和暖如春各淀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背诡挂。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工碎浇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人璃俗。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓奴璃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親城豁。 傳聞我的和親對象是個殘疾皇子苟穆,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內容