29(M)-jQuery

需求:造一个API可以获取所有兄弟姐妹节点

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
<ul>
  <li id="item1">选项1</li>
  <li id="item2">选项2</li>
  <li id="item3">选项3</li>
  <li id="item4">选项4</li>
  <li id="item5">选项5</li>
</ul>
</body>
</html>
//第一步声明一个变量把所有children收集起来
var allChildren = item3.parentNode.children
//然后二话不说遍历它
for (let i =0; i < allChildren.length; i++){}
//1.声明一个伪数组。2.遍历。3.判断是否等于自己。4.放入伪数组。5.length+1
var array = {
  length: 0
}
for(let i = 0; i < allChildren.length; i++){
  if (allChildren[i] !==item3){
      array[array.length] = allChildren[i]
      array.length +=1
  }
}
//然后封装个函数
function getSiblings(nodes) {
  var allChildren = nodes.parentNode.children
  var array = {
    length: 0
  }
  for (let i = 0; i < allChildren.length; i++) {
    if (allChildren[i] !== nodes) {
      array[array.length] = allChildren[i]
      array.length += 1
    }
  }
  return array
}
console.log(getSiblings(item3))
//如果要给item3加三个class
item3.classList.add('a')
item3.classList.add('b')
item3.classList.add('c')
//这肯定不行一看就很蠢,重新申明一个数组,然后遍历这个数组
var classes = ['a','b','c']
classes.forEach((value) =>item3.classList.add(value))

//再进化一下,把classes做成可以add也可以remove,但是这时候数组就不够用了,要用哈希了也就是对象嘛。
//另外如果用了哈希就不能用forEach了要用for(let key in classes)
var classes = {'a':true,'b':false,'c':true}
for (let key in classes){
  if(key === true){
    item3.classList.add(key)
  }else{
    item3.classList.remove(key)
  }
}
//封装成函数,我要对谁添加哪些class?所以需要两个参数
function addClasses(nodes, classes) {
  for (let key in classes) {
    if (classes[key]) {
      nodes.classList.add(key)
    } else {
      nodes.classList.remove(key)
    }
  }
}
addClasses(item3, {'a': true,'b': true,'c': false})
console.log(item3)
//优化一下代码(出现类似代码就有优化的可能)
//就add和remove不同,而判断有个简化的写法。适用于判断后运行结果比较简单的情况
function addClasses(nodes,classes) {
  for (let key in classes) {
    var methodName = classes[key] ? 'add' : 'remove'
    item3.classList[methodName](key)
  }
}
addClasses(item3,{'a': true,'b': true,'c': false})
console.log(item3)
//为了演示方便还是把addClass写得简单点
function addClasses(nodes,classes) {
  classes.forEach(value =>nodes.classList.add(value))
}
//防止自创API覆盖其他变量
window.cyp ={}
cyp.getSiblings=function (nodes) {
  var allChildren = nodes.parentNode.children
  var array = {
    length: 0
  }
  for (let i = 0; i < allChildren.length; i++) {
    if (allChildren[i] !== nodes) {
      array[array.length] = allChildren[i]
      array.length += 1
    }
  }
  return array
}

cyp.addClasses=function (nodes,classes) {
  classes.forEach(value =>nodes.classList.add(value))
}
cyp.addClasses(item3,['a','b','c'])
console.log(item3)
//这是种方法声明一个cyp对象,对象里面放着函数,再试试另外一种方法。
//另外一种方法是声明一个函数,这个函数返回一个对象,对象里面放着函数。
window.cyp = function(node) {
  return {
    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
    },
    addClasses: function(classes) {
      classes.forEach(value => node.classList.add(value))
    }
  }
}
var cyp2 = cyp(item3)
cyp2.addClasses(['a', 'b','c'])
console.log(item3)

在对比一下这两种用法:
1.cyp.addClasses(item3,['a','b','c'])
2.var cyp2 = cyp(item3)
cyp2.addClasses(['a', 'b','c'])
所以如果我要对item1~100进行操作,第一种方法写100行代码,第二种写200行代码。第一种代码少!
如果我100个API都对item3进行操作。那第一种还是100行代码,第二种101行。第二种代码少!
把cyp换成jQuery就是jQuery了

//jQuery要比这个还厉害点,这里只能传入节点。jQuery可以传入选择器,所以再把代码升级一下
window.jQuery = function(nodeOrSelector) {
  let node
  if (typeof nodeOrSelector === "string") {
    node = document.querySelector(nodeOrSelector)
  } else {
    node = nodeOrSelector
  }
  return {
    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
    },
    addClasses: function(classes) {
      classes.forEach(value => node.classList.add(value))
    }
  }
}
var cyp2 = jQuery('#item3')
cyp2.addClasses(['a', 'b'])
console.log(item3)
//可以用选择器意味着除了id还能用节点如'ul > li:nth-child(3)'
var cyp2 = jQuery('ul > li:nth-child(3)')

现在我又想升级一下,要操作多个节点,给ul下面的所有li都加class,这在css中很常用所以这里必须也得有这个API。上面是判断传入的是string还是node,如果是string的话就根据string拿到node,下面是判断如果是string就收集所有的node放到一个伪数组。如果是node也放到一个伪数组。所以最终都是node的伪数组,里面可能是一个或者多个node。

window.jQuery = function(nodeOrSelector) {
  let nodes = {}
  if (typeof nodeOrSelector === "string") {
    nodes = document.querySelectorAll(nodeOrSelector)
  } else if (nodeOrSelector instanceof Node) {//这边要if里面写判断了,所以不能直接else要else if
    node = {
      0: nodeOrSelector,
      length: 0
    }
  }
  nodes.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
  }
  nodes.addClasses = function(classes) {
    classes.forEach(value => {
      for (let i = 0; i < nodes.length; i++) {
        nodes[i].classList.add(value)
      }
    })
  }
  return nodes
}
var cyp2 = jQuery('ul > li')
cyp2.addClasses(['a', 'b'])
console.log(item3)

再造一个获取文本API和改变文本API

  nodes.getText = function() {
    var texts = []
    for (let i = 0; i < nodes.length; i++) {
      //       texts[i] = nodes[i].textContent
      texts.push(nodes[i].textContent)
    }
    return texts
  }
  nodes.setText = function(text) {
    for (let i = 0; i < nodes.length; i++) {
      nodes[i].textContent = text
    }
  }

另外jQuery把getText和setText合并了。判断如果参入参数了,那么就是修改text如果没有传入就是获取text

  nodes.text = function(text) {
    if (text === undefined) {
      var texts = []
      for (let i = 0; i < nodes.length; i++) {
        //       texts[i] = nodes[i].textContent
        texts.push(nodes[i].textContent)
      }
      return texts
    } else {
      for (let i = 0; i < nodes.length; i++) {
        nodes[i].textContent = text
      }
    }
  }
//undefined 和布尔以前判断用了true还是false这里用undefined
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,460评论 1 45
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,168评论 0 3
  • $HTML, HTTP,web综合问题 1、前端需要注意哪些SEO 2、 的title和alt有什么区别 3、HT...
    Hebborn_hb阅读 4,592评论 0 20
  • 前端开发面试题 面试题目: 根据你的等级和职位的变化,入门级到专家级,广度和深度都会有所增加。 题目类型: 理论知...
    怡宝丶阅读 2,576评论 0 7
  • jQuery 是什么? jQuery实质上是一个构造函数,接受一个参数,这个参数可能是节点,然后返回一个方法对象去...
    夜未央_M阅读 663评论 0 0