手写一个简单的JQuery

这一生的挚爱 提交于 2020-04-14 12:24:10

【推荐阅读】微服务还能火多久?>>>

测试样本
<!--测试样本-->
<body>
  <div id="jq">1</div>
  <div class="hello">2</div>
  <div class="hello">3</div>
</body>
为什么jq 使用$(selector)就能够获取DOM呢
原生的js该怎么实现
//事实证明通过如下方式不管传入的是id选择器还是class选择器都是可行的 
document.querySelectorAll(selector)
获取DOM中的第几个元素
// 因为我们获取到的是一个NodeList数组,那么当然可以通过下标获取(注意不要越界)
document.querySelectorAll(selector)[0]
给元素添加class
// 添加完毕以后查看DOM结构的class中就多了一个class属性world
document.querySelectorAll(".hello").forEach(d=>{
    d.classList.add("world")
})
添加css属性
// 我们希望给每一个元素添加上宽、高、颜色几个属性
let css = {
    "width": "2rem",
    "height": "1rem",
    "color": "red"
  }
document.querySelectorAll(".hello").forEach(d=>{
      Object.keys(css).map(k =>{
        d.style[k] = css[k];
      });
    })

上面的方式看起来比较麻烦,每次都要调用,如何做到只调用一次即可实现并且像jq那样做到链式调用。

改良
// 获取DOM元素
  function $(selector) {
    return Array.from(document.querySelectorAll(selector));
  }
  // 添加class
  Array.prototype.addClassName = function(className){
    this.forEach(d =>{
      d.classList.add(className);
    })
    return this;
  }

  // 添加css
  Array.prototype.css = function(options){
    this.forEach(d=>{
      Object.keys(options).map(k =>{
        d.style[k] = options[k];
      });
     return this;
    })

    return this;
  }
  // 查找元素
  Array.prototype.eq = function(idx){
    return this[idx];
  }
jQuery初体验
console.log($(".hello").addClassName("nihao").css({
    "width": "2rem",
    "height": "1rem",
    "color": "red"
  }).eq(2)); //测试一下

通过上述的一顿操作可以实现链式调用,越来越像那么回事了。

我们希望将更多的细节封装在对象的内部
class JQuery{
    constructor(selector) {
      this.elements = Array.from(document.querySelectorAll(selector));
    }

    eq(index){
      return this.elements[index];
    }
    css(options){
      this.elements.forEach(d=>{
        Object.keys(options).map(k =>{
          d.style[k] = options[k];
        });
      })
      return this;
    }
    addClass(className){
      this.elements.forEach(d=>{
        d.classList.add(className);
      })
      return this;
    }
  }
越来越jQuery
console.log(new JQuery("#jq").addClass("hha").css({
  "width": "2rem",
  "height": "1rem",
  "color": "red"
}).eq(1)); // 测试一下

换成es6语法进行简单的封装以后,发现依然可以实现,而且结构越来越清晰了呢,另外对于attr、html、text等方法没有实现。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!