jQuery初體驗(yàn)

作業(yè)題

  1. HTML代碼
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
<div>選項(xiàng)1</div>
<div>選項(xiàng)2</div>
<div>選項(xiàng)3</div>
</body>
</html>
  1. CSS代碼
.red{
  color:red;
}
  1. JS代碼
window.jQuery = function(nodeOrSelector){//先接受一個(gè)節(jié)點(diǎn)或者選擇器
  let nodes = {}//聲明一個(gè)空的偽數(shù)組
  if(typeof nodeOrSelector === 'string'){//如果接受的是一個(gè)字符串
    let temp = document.querySelectorAll(nodeOrSelector)//建立一個(gè)臨時(shí)的偽數(shù)組
    for(let i=0;i<temp.length;i++){
      nodes[i] = temp[i]//遍歷一遍,放進(jìn)nodes,獲得一個(gè)只有key:value和length和__proto__的純凈的偽數(shù)組
  }   nodes.length = temp.length
  }else if(nodeOrSelector instanceof node){//如果是一個(gè)節(jié)點(diǎn)营曼,就封裝成偽數(shù)組
    nodes = {0:nodeOrSelector,length:1}
  }
  nodes.addClass = function (classes){//給nodes添加addClass屬性
    for(let i=0;i<nodes.length;i++){
     nodes[i].classList.add(classes)//用的是DOM的API
   }
  }
  nodes.setText = function (text){給nodes添加setText屬性
   for(let i=0;i<nodes.length;i++){
     nodes[i].textContent = text
   }
  }
  return nodes//把nodes送出去
}
window.$ = jQuery
var $div = $('div')
$div.addClass('red') // 可將所有 div 的 class 添加一個(gè) red
$div.setText('hi') // 可將所有 div 的 textContent 變?yōu)?hi

jQuery 接受舊節(jié)點(diǎn)囊扳,返回新的對(duì)象,新API調(diào)用的還是DOM得API

學(xué)習(xí)jQuery的過(guò)程净蚤,基本思路

  1. 封裝數(shù)組
    把節(jié)點(diǎn)的所有兄弟(不包括自己)放進(jìn)一個(gè)偽數(shù)組
    HTML代碼
<body>
  <ul>
    <li id="item1">選項(xiàng)1</li>
    <li id="item2">選項(xiàng)2</li>
    <li id="item3">選項(xiàng)3</li>
    <li id="item4">選項(xiàng)4</li>
    <li id="item5">選項(xiàng)5</li>
  </ul>
</body>

JS代碼第一步,找到所有兄弟茉贡,放進(jìn)偽數(shù)組

var allChildren = node.parentNode.children//獲得節(jié)點(diǎn)node的父節(jié)點(diǎn)的所有子標(biāo)簽
 var array = { length: 0 }
  for (let i = 0; i < allChildren.length; i++) {
    if (allChildren[i] !== node) {//如果子標(biāo)簽不是node自己塞栅,而是他的所有兄弟
      array[array.length] = allChildren[i]//把他們放進(jìn)array偽數(shù)組里,這里不用array[i] = allChild[i]的原因是i可能會(huì)跳過(guò)一個(gè)腔丧,不能一一對(duì)應(yīng)放椰。
      array.length += 1//每放進(jìn)一個(gè),length+1
    }
  }

JS代碼第二步愉粤,封裝成函數(shù)

function getSiblings(node) { //這就叫API砾医,node就是需要外部輸入的節(jié)點(diǎn).函數(shù)名叫g(shù)etSiblings
  var allChildren = node.parentNode.children

  var array = {
    length: 0
  }
  for (let i = 0; i < allChildren.length; i++) {
    if (allChildren[i] !== node) {
      array[array.length] = allChildren[i]
      array.length += 1
    }
  }
  return array//把這個(gè)偽數(shù)組送出去
}
getSiblings(item3)//調(diào)用函數(shù),獲取item3這個(gè)節(jié)點(diǎn)的所有兄弟

注:判斷子標(biāo)簽是不是給定的節(jié)點(diǎn)自己不用==或者衣厘!=是因?yàn)檫@兩個(gè)太復(fù)雜了如蚜。

  1. 命名空間
    2.1 參照DOM的API命名,document.xxx()影暴,我們也可以聲明一個(gè)變量比如
window.mydom = {}
mydom.getSiblings = getSliblings

mydom.getSiblings(item3)//使用API

2.2 命名空間的好處:
1 那么為什么要使用命名空間呢错邦,假如你封裝了很多API,你想要?jiǎng)e人也能使用這個(gè)工具型宙,就取個(gè)名字比如mydom撬呢,方便宣傳,能讓別人一眼知道該去哪里找到你的API妆兑。
2 如果不使用命名空間魂拦,比如別人也聲明了一個(gè)getSiblings = xxx毛仪,那么就會(huì)被覆蓋掉。
命名空間后的代碼

window.mydom = {} /*yui*/
mydom.getSiblings = function (node) { 
  var allChildren = node.parentNode.children
  var array = { length: 0 }
  for (let i = 0; i < allChildren.length; i++) {
    if (allChildren[i] !== node) {
      array[array.length] = allChildren[i]
      array.length += 1
    }
  }
  return array
}

2.3 但是每次調(diào)用需要輸入mydom.getSiblings(item3)有點(diǎn)麻煩芯勘,為什么不能直接輸入item3.getSiblings()呢箱靴。怎么實(shí)現(xiàn)呢?來(lái)看這個(gè)例子:我們?cè)?code>Node的公有屬性中直接添加一個(gè)函數(shù)

Node.prototype.getSiblings = function (){ console.log(1)}
item3.getSliblings() //1

我們來(lái)修改下上面的封裝函數(shù)

Node.prototype.getSiblings = function () { 
  var allChildren = this.parentNode.children
  var array = { length: 0 }
  for (let i = 0; i < allChildren.length; i++) {
    if (allChildren[i] !== this) {
      array[array.length] = allChildren[i]
      array.length += 1
    }
  }
  return array
}
item3.getSiblings ()

注:為什么使用this就能獲取node呢荷愕?因?yàn)?code>item3.getSiblings ()
等同于item3.getSiblings.call(item3)

這樣直接在原型鏈上添加函數(shù)的缺點(diǎn):萬(wàn)一別人也添加了相同的衡怀,就會(huì)覆蓋。
換一種方法:

window.node2 = function(node){//node就是需要操作的那個(gè)節(jié)點(diǎn)
  return{//返回的是一個(gè)對(duì)象路翻,key為getSiblings狈癞,value為function(){}
  getSiblings:function(){}
}
}
var node2 = node2(item3)//item3就是函數(shù)里的node
node2.getSiblings()

把setSiblings的函數(shù)體放進(jìn)去

window.node2 = function(node){//node就是需要操作的那個(gè)節(jié)點(diǎn)
  return{//返回的是一個(gè)對(duì)象茄靠,key為getSiblings茂契,value為function(){}
  getSiblings:function(){
     var allChildren = this.parentNode.children
     var array = { length: 0 }
     for (let i = 0; i < allChildren.length; i++) {
     if (allChildren[i] !== this) {
      array[array.length] = allChildren[i]
      array.length += 1
    }
  }
  return array
}
}
}
var node2 = node2(item3)//item3就是函數(shù)里的node
node2.getSiblings()

這樣就實(shí)現(xiàn)了使用node2.getSiblings()的需求

把代碼中的node2改成jQuery

window.jQuery= function(node){
  return{
  getSiblings:function(){
     var allChildren = this.parentNode.children
     var array = { length: 0 }
     for (let i = 0; i < allChildren.length; i++) {
     if (allChildren[i] !== this) {
      array[array.length] = allChildren[i]
      array.length += 1
    }
  }
  return array
}
}
}
var node2 = jQuery(item3)
node2.getSiblings()

這就是jQuery的基本思路。
jQuery功能更加強(qiáng)大慨绳,不僅可以接受node節(jié)點(diǎn)掉冶,還能接受選擇器

window.jQuery= function(nodeOrSelector){
 let node
 if (typeof nodeOrSelector === 'string'){
   node = document.querySelector(nodeOrSelector)  
}else{ node = nodeOrSelector}
  return{
  getSiblings:function(){
     var allChildren = node.parentNode.children
     var array = { length: 0 }
     for (let i = 0; i < allChildren.length; i++) {
     if (allChildren[i] !== node) {
      array[array.length] = allChildren[i]
      array.length += 1
    }
  }
  return array
}
}
}
var node2 = jQuery('#item3')
node2.getSiblings()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市脐雪,隨后出現(xiàn)的幾起案子厌小,更是在濱河造成了極大的恐慌,老刑警劉巖战秋,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件璧亚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡脂信,警方通過(guò)查閱死者的電腦和手機(jī)癣蟋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)狰闪,“玉大人疯搅,你說(shuō)我怎么就攤上這事÷癖茫” “怎么了幔欧?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)丽声。 經(jīng)常有香客問(wèn)我礁蔗,道長(zhǎng),這世上最難降的妖魔是什么雁社? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任浴井,我火速辦了婚禮,結(jié)果婚禮上歧胁,老公的妹妹穿的比我還像新娘滋饲。我一直安慰自己厉碟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布屠缭。 她就那樣靜靜地躺著箍鼓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呵曹。 梳的紋絲不亂的頭發(fā)上款咖,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音奄喂,去河邊找鬼铐殃。 笑死,一個(gè)胖子當(dāng)著我的面吹牛跨新,可吹牛的內(nèi)容都是我干的富腊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼域帐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼赘被!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起肖揣,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤民假,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后龙优,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體羊异,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年彤断,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了野舶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瓦糟,死狀恐怖筒愚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情菩浙,我是刑警寧澤巢掺,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站劲蜻,受9級(jí)特大地震影響陆淀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜先嬉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一轧苫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦含懊、人聲如沸身冬。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)酥筝。三九已至,卻和暖如春雏门,著一層夾襖步出監(jiān)牢的瞬間嘿歌,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工茁影, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宙帝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓募闲,卻偏偏與公主長(zhǎng)得像步脓,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蝇更,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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

  • 一年扩、為什么會(huì)出現(xiàn)jQuery呢? 客觀原因:原生JS的API有很多的不便访圃,DOM的API尤其反人類厨幻,所以這一期就從...
    饑人谷_朱笑笑啊閱讀 265評(píng)論 0 0
  • jQuery 是什么? jQuery實(shí)質(zhì)上是一個(gè)構(gòu)造函數(shù)腿时,接受一個(gè)參數(shù)况脆,這個(gè)參數(shù)可能是節(jié)點(diǎn),然后返回一個(gè)方法對(duì)象去...
    夜未央_M閱讀 665評(píng)論 0 0
  • 什么是JQ批糟? 一個(gè)優(yōu)秀的JS庫(kù) 寫(xiě)越少的代碼格了,做越多的事情 JQ的好處? 簡(jiǎn)化JS的復(fù)雜操作 不再需要關(guān)心兼容性 ...
    卓小生閱讀 240評(píng)論 0 1
  • 1. 封裝一個(gè)函數(shù) 1.1 再封裝一個(gè) 代碼優(yōu)化守則:如果出現(xiàn)類似的代碼徽鼎,就存在優(yōu)化的可能 2. 命名空間 2.1...
    酒當(dāng)茶閱讀 402評(píng)論 0 0
  • 1.什么是jQuery?jQuery就是一個(gè)js庫(kù)盛末,使用jQuery的話,會(huì)比使用JavaScript更簡(jiǎn)單否淤。js...
    well_907c閱讀 117評(píng)論 0 1