jQuery设计思想与简单实现

197 阅读2分钟

前言

jQuery的实现其实都是基于DOM的API,但是由于DOM的原生API比较难用,于是有了jQuery。 jQuery的基本核心设计思想是:它声明一个全局函数jQuery,使用别名$,对接受参数进行重载,获取对应的元素,之后便返回一个对象,称为jQuery构造出来的对象,再用这个对象去操作获取到的元素。

jQuery如何获取元素

jQuery使用$(selector)的方法实现获取网页元素的操作,我们这里用DOM的API的querySelector去实现它。

window.jQuery = $.jQuery = function(selector){
    let elements = document.querySlector(selector)
    return {//返回一个操作elements的对象}
}

上面的函数只能用于查找网页元素,如果我们需要继续查找元素的内容则需要封装一个find函数:

find(selector) {
    let array = [];
    for (let i = 0; i < this.elements.length; i++) {
      const elements2 = Array.from(this.elements[i].querySelectorAll(selector));
      array = array.concat(this.elements2);
    }
    array.oldApi = this; // this 就是 旧 api
    return jQuery(array);
  },

jQuery的链式操作

由于jQuery每次返回的是一个对象,在对同一个对象进行不同的操作可以连在一起,其原因是每次操作都会返回this,这个this就是当前被操作的对象,也称为链式操作。

jQuery 如何创建元素

$(function(){
    let $h1=$("<h1></h1>")
})

jQuery 如何移动元素

jQuery设计思想之五,就是提供两组方法,来操作元素在网页中的位置移动。一组方法是直接移动该元素,另一组方法是移动其他元素,使得目标元素达到我们想要的位置。

假定我们选中了一个div元素,需要把它移动到p元素后面。 第一种方法是使用.insertAfter(),把div元素移动p元素后面:

&emsp;$('div').insertAfter($('p'));

第二种方法是使用.after(),把p元素加到div元素前面:

$('p').after($('div'));

表面上看,这两种方法的效果是一样的,唯一的不同似乎只是操作视角的不同。但是实际上,它们有一个重大差别,那就是返回的元素不一样。第一种方法返回div元素,第二种方法返回p元素。你可以根据需要,选择到底使用哪一种方法。

使用这种模式的操作方法,一共有四对:

&emsp;.insertAfter()和.after()://在现存元素的外部,从后面插入元素

&emsp;&emsp;.insertBefore()和.before()://在现存元素的外部,从前面插入元素

&emsp;&emsp;.appendTo()和.append()://在现存元素的内部,从后面插入元素

&emsp;&emsp;.prependTo()和.prepend()://在现存元素的内部,从前面插入元素

这部分摘自阮一峰《jQuery设计思想》,地址如下: http://www.ruanyifeng.com/blog/2011/07/jquery_fundamentals.html

jQuery 如何修改元素的属性

首先我们需要选中需要修改的元素,然后使用相对应的函数进行修改,例如下面的代码,先选择到class为test的div,找到所有的child,然后添加一个class属性red:

window.jQuery = function (selectorOrArray) {
  let elements;
 if(typeof selectorOrArray === 'string'){
    elements = document.querySelectorAll(selectorOrArray)
  }else if(selectorOrArray instanceof Array){
    elements = selectorOrArray
  }

return {
  addClass(className) {
    for (i = 0; i < elements.length; i++) {
      elements[i].classList.add(className);
    }
    return this;
  },
  find(selector) {
    let array = [];
    for (i = 0; i < elements.length; i++) {
      array = array.concat(Array.from(elements[i].querySelectorAll(selector)));
    }

    return jQuery(array);
  }
  }
};
window.$ = window.jQuery

$('#test').find('.child').addClass('red') 

链接地址http://js.jirengu.com/goguzopiqu/1/edit?js,output