用DOM实现仿jQueryAPI

选择实现添加类和改写标签里面文字的功能

  1. 添加类
    先声明一个函数
function addClass(nodes, className) {
    for (let i = 0; i < nodes.length; i++) {
      nodes[i].classList.add(className)
    }
}
  1. 改写标签里面文字
function setText(nodes, text) {
    for (let i = 0; i < nodes.length; i++) {
      nodes[i].textContent = text
    }
}
  1. 给这两个函数一个公共的命名空间(也就是用一个函数包装起来)
window.jQuery=function jquery(nodes) {
 return {
    addClass: function(className) {
      for (let i = 0; i < nodes.length; i++) {
        nodes[i].classList.add(className)
      }
    },
    setText: function(text) {
      for (let i = 0; i < nodes.length; i++) {
        nodes[i].textContent = text
      }
    }
  }
}

此时这个函数的两个key就分别是addClasssetText,因为它们有同一个参数nodes,所以可以把nodes放到共同的命名空间里,传入进来

  1. 判断传入的参数是节点还是选择器语句(字符串)
    先把参数nodes改成nodeOrSelector,声明nodes为一个空对象
let nodes={}
if(typeof nodeOrSelector === 'string'){
     let temp  = document.querySelectorAll(nodeOrSelector)
     for (let i = 0; i < temp.length; i ++){
         nodes[i] = temp[i]
     }
    nodes.length = temp.length
  }
  else if (nodeOrSelector instanceof Node){
     nodes = {
         0: nodeOrSelector,
         length: 1
     }
   }

这样无论传入的参数是什么,都能获取到,然后传入nodes这个伪数组里

  1. 直接在工具函数中使用nodes,就成了闭包,然后遍历伪数组拿到值,进行DOM操作
addClass: function(className) {
      for (let i = 0; i < nodes.length; i++) {
        nodes[i].classList.add(className)
      }
    }
setText: function(text) {
      for (let i = 0; i < nodes.length; i++) {
        nodes[i].textContent = text
      }
    }

6.然后给函数改个名字

window.jQuery=$

7.完整代码

window.jQuery = function jquery(nodeOrSelector) {
  let nodes = {}
  if (typeof nodeOrSelector === 'string') {
    let temp = document.querySelectorAll(nodeOrSelector)
    for (let i = 0; i < temp.length; i++) {
      nodes[i] = temp[i]
    }
    nodes.length = temp.length
  } else if (nodeOrSelector instanceof Node) {
    nodes = {
      0: nodeOrSelector,
      length: 1
    }
  }
  return {
    addClass: function(className) {
      for (let i = 0; i < nodes.length; i++) {
        nodes[i].classList.add(className)
      }
    },
    setText: function(text) {
      for (let i = 0; i < nodes.length; i++) {
        nodes[i].textContent = text
      }
    }
  }
}
window.$ = jQuery

8.JS Bin上面的效果


仿jQuery

你可能感兴趣的:(用DOM实现仿jQueryAPI)