javascript(六):理解JQuery

262 阅读2分钟

动手写一个jQuery

封装两个函数

<ul>
    <li id='item1'>选项1</li>
    <li id='item2'>选项2</li>
    <li id='item3' class = 's'>选项3</li>
    <li id='item4'>选项4</li>
    <li id='item5'>选项5</li>

</ul>
//获取所有兄弟姐妹
function getSiblings(node){ 
  var allChild = node.parentNode.children
  var array = {
  length:0
   }
  for (let i= 0;i<allChild.length;i++){
    if(allChild[i]!== node){
      array[array.length] =allChild[i]
      array.length += 1
            }
        }
    }
// 循环添加classList
function addclass (node,classes){
for(let key in classes){
  var methodName = classes[key] ? 'add':'remove'
    node.classList[methodName](key)

}
}
addclass(item2, {'a':true,'b':false,'c':true})

命名空间(yui)

window.madom = {}

//获取所有兄弟姐妹
madom.getSiblings = function getSiblings(node){ 
  var allChild = node.parentNode.children
  var array = {
  length:0
   }
  for (let i= 0;i<allChild.length;i++){
    if(allChild[i]!== node){
      array[array.length] =allChild[i]
      array.length += 1
            }
        }
    }
// 循环添加classList
madom.addclass = function addclass (node,classes){
for(let key in classes){
  var methodName = classes[key] ? 'add':'remove'
    node.classList[methodName](key)

}
}

madom.addclass(item2, {'a':true,'b':false,'c':true})
madom.getSiblings(item3)

Node.prototype

添加到Node的共有属性

//获取所有兄弟姐妹
Node.prototype.getSiblings = function getSiblings(node){ 
  var allChild = this.parentNode.children
  var array = {
  length:0
   }
  for (let i= 0;i<allChild.length;i++){
    if(allChild[i]!== this){
      array[array.length] =allChild[i]
      array.length += 1
            }
        }
    }
// 循环添加classList
Node.prototype.addClass = function addclass (,classes){
for(let key in classes){
  var methodName = classes[key] ? 'add':'remove'
    this.classList[methodName](key)

}
}
item3.getSiblings()   
//此时item3就是this,会传参进去,等价于item3.getSiblings.call(item3)
item3.addclass(item2, {'a':true,'b':false,'c':true})

写一个Node2

node2是一个存储返回值地址的对象

jQuery

一个升级的Dom,接收一个node或者选择器,返回一个新的对象,新的对象有新的API

操作多个node的jQuery

创造的temp数组是一个有干净的Object原型链数组(非NodeList原型链),同理返回的node数组也是干净的原型链。既然是哈希,就可以往里边加函数,

1.0版本

2.0版本
jQuery到底在做什么呢,他接受一个参数,识别这个参数到底是元素还是选择器,调用原生api来获取目标元素,同时把他们返回到一个干净的伪数组里面,然后使用封装好的函数,对这个伪数组进行修改。

3.0版本

给了参数就是修改,没给参数就是获取

小总结

jQuery就是一个函数,接收一个选择器或者节点,将接收到的信息的目标封装成一个伪 数组,同时调用封装好的函数(内部调用DOM API)对封装好的伪数组进行操作,并返回这个伪数组。

node2就是一个hash。

题目

<div id=x></div>
var div = document.getElementById('x')
var $div = $('#x')

请说出 div 和 $div 的联系和区别。\
div 和 $div 的联系是:

$(div) 可以将 div 封装成一个 jQuery 对象,就跟 $div 一样

**$div[0] === div ,$div 的第一项就是 div**

div 和 $div 的区别是:

div 的属性和方法有 childNodes firstChid nodeType 等

$div 的 属性和方法有 addClass removeClass toggleClass 等