实现一个 jQuery 的 API

2019-08-27  本文已影响0人  饥人谷_ika0s

这个api的功能:

var $div = $('div')
$div.addClass('red') // 可将所有 div 的 class 添加一个 red
$div.setText('hi') // 可将所有 div 的 textContent 变为 hi

1.先搭出总体结构,对传入参数进行类型判断,无论传入的是选择器还是node节点,都返回一个对象

window.jQuery = function(nodesOrSelector) {
      let nodes = {};
      if(typeof nodesOrSelector==='string'){//如果传入的是选择器
          nodes=document.querySelectorAll(nodeOrSelector);
      }else if((nodesOrSelector instanceof Node)){//如果传入的是node节点
          nodes={'0':nodesOrSelector,'length':1}
      }
      nodes.addClass = function(classes) {};
      nodes.setText = function(text) {};
      return nodes
    };
window.$ = jQuery;

2.两个功能的实现

 window.jQuery = function(nodesOrSelector) {
      let nodes = {};
      if (typeof nodesOrSelector === "string") {
        //如果传入的是选择器
        nodes = document.querySelectorAll(nodesOrSelector);
      } else if (nodesOrSelector instanceof Node) {
        //如果传入的是node节点
        nodes = { '0': nodesOrSelector, 'length': 1 };
      }
      nodes.addClass = function(classes) {
        //两层循环,外层遍历node,每次遍历给node添加所有的class,所以加一个内循环,遍历class
        for (let i = 0; i < nodes.length; i++) {
          classes.forEach(value => {
            nodes[i].classList.add(value);
          });
        }
      };
      nodes.setText = function(text) {
        for (let i = 0; i < nodes.length; i++) {
          nodes[i].textContent = text;
        }
      };
      return nodes;
    };

可以看到每个div的颜色变成了红色,里面也添上了文字


完整代码如下

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>JS Bin</title>
  </head>
  <style>
    div {
      width: 50px;
      height: 30px;
      margin-bottom: 10px;
      background-color: blue;
    }
    .red {
      background-color: red;
    }
  </style>
  <body>
    <div></div>
    <div></div>
  </body>
  <script>
    window.jQuery = function(nodesOrSelector) {
      let nodes = {};
      if (typeof nodesOrSelector === "string") {
        //如果传入的是选择器
        nodes = document.querySelectorAll(nodesOrSelector);
      } else if (nodesOrSelector instanceof Node) {
        //如果传入的是node节点
        nodes = { 0: nodesOrSelector, length: 1 };
      }
      nodes.addClass = function(classes) {
        //两层循环,外层遍历node,每次遍历给node添加所有的class,所以加一个内循环,遍历class
        for (let i = 0; i < nodes.length; i++) {
          classes.forEach(value => {
            nodes[i].classList.add(value);
          });
        }
      };
      nodes.setText = function(text) {
        for (let i = 0; i < nodes.length; i++) {
          nodes[i].textContent = text;
        }
      };
      return nodes;
    };
    window.$ = jQuery;
    var $div = $("div");
    $div.addClass(["red"]);
    $div.setText("hi");
  </script>
</html>
上一篇下一篇

猜你喜欢

热点阅读