深入理解JQuery原理

本文将手把手逐渐实现一个简化版的 JQuery

先来自己动手简化选择器

base 是一个对象,拥有两个方法,方法名为 $$$,功能分别为通过 idclass 来获取元素。

var base = {
    $:function(id){
        return document.getElementById(id);
    },
    $$:function(className){
        return document.getElementsByClassName(className);
    }
}

//使用
base.$("id");       //返回相应的元素对象
base.$$("class");   //返回相应的元素对象集合

进阶,向JQuery靠拢

声明一个全局方法 $,用于返回一个 base 对象。

var $ = function(){
    return new Base();
}
function Base(){
    this.$ = function(id){
        return document.getElementById(id);
    };

    this.$$ = function(className){
        return document.getElementsByClassName(className);
    };
}

//使用
$().$("id");       //返回相应的元素对象
$().$$("class");   //返回相应的元素对象集合

加上css方法

增加 css 方法,就可以通过 el.css().css() 链式调用的形式给元素增加样式。

var $ = function(){
    return new Base();
}
function Base(){
    this.elements = []  //创建一个数组,来保存获取的节点和节点数组

    this.$ = function(id){
        //因为每一次使用$都会新建对象,所以不需要清空,不会异常
        this.elements.push(document.getElementById(id));
        return this;  //一定要返回对象,不然无法进行连缀
    };

    this.$$ = function(className){
        var clss = document.getElementsByClassName(className);
        for(var i = 0 ;i < clss.length; i++){
            this.elements.push(clss[i]);
        }
        return this;
    };

    this.css = function(attr,val){
        for(var i = 0;i < this.elements.length; i++){
            this.elements[i].style[attr] = val;
        }
        return this;
    }
}

//使用
$().$("id").css("color","white").css("background","black");       //返回相应的元素对象
$().$$("class").css("color","red").css("border","1px dotted black");   //返回相应的元素对象集合

加上eq方法

用于遍历元素,添加一个 current 变量即可

var $ = function(){
    return new Base();
}
function Base(){
    this.elements = [];  //创建一个数组,来保存获取的节点和节点数组
    this.current = -1;   //用于遍历

    this.$ = function(id){
        //因为每一次使用$都会新建对象,所以不需要清空,不会异常
        this.elements.push(document.getElementById(id));
        return this;  //一定要返回对象,不然无法进行连缀
    };

    this.$$ = function(className){
        var clss = document.getElementsByClassName(className);
        for(var i = 0 ;i < clss.length; i++){
            this.elements.push(clss[i]);
        }
        return this;
    };

    this.eq = function(index){
        this.current = index;
        return this;
    }

    this.css = function(attr,val){
        if(this.current != -1)this.elements[this.current].style[attr] = val;
        else{
            for(var i = 0;i < this.elements.length; i++){
              this.elements[i].style[attr] = val;
            }
        }
        return this;
    }
}

//使用
$().$("id").css("color","white").css("background","black");       //返回相应的元素对象
$().$$("class").eq(1).css("color","red").css("border","1px dotted black");   //返回相应的元素对象集合

通过$("str")来获取元素

进一步封装 $ 函数,从而使得调用方法对标 JQuery

$('#id').css().css()

$('.class').eq(2).css().css()

var $ = function(str){
    var base = new Base();
    if(str[0] == "#"){
      base.$(str.substr(1,str.length - 1));
    }
    else if(str[0] == '.'){
      base.$$(str.substr(1,str.length - 1));
    }
    else{
      //TagName
    }
    return base;
}
function Base(){
    this.elements = [];  //创建一个数组,来保存获取的节点和节点数组
    this.current = -1;   //用于遍历

    this.$ = function(id){
        //因为每一次使用$都会新建对象,所以不需要清空,不会异常
        this.elements.push(document.getElementById(id));
        return this;  //一定要返回对象,不然无法进行连缀
    };

    this.$$ = function(className){
        var clss = document.getElementsByClassName(className);
        for(var i = 0 ;i < clss.length; i++){
            this.elements.push(clss[i]);
        }
        return this;
    };

    this.eq = function(index){
        this.current = index;
        return this;
    }

    this.css = function(attr,val){
        if(this.current != -1)this.elements[this.current].style[attr] = val;
        else{
            for(var i = 0;i < this.elements.length; i++){
              this.elements[i].style[attr] = val;
            }
        }
        return this;
    }
}

//使用
$("#id").css("color","white").css("background","black");       //返回相应的元素对象
$(".class").eq(1).css("color","red").css("border","1px dotted black");   //返回相应的元素对象集合
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、样式篇 第1章 初识jQuery (1)环境搭建 进入官方网站获取最新的版本 http://jquery.co...
    凛0_0阅读 3,482评论 0 44
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,812评论 1 45
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,350评论 0 3
  • 第一章 jQuery简介 1-1 jQuery简介 1.简介 2.优势 3.特性与工具方法 1-2 环境搭建 进入...
    mo默22阅读 1,628评论 0 11
  • jQuery基础(一)——样式篇 1-2环境搭建 1-3 jQuery HelloWorld体验 $(docume...
    croyance0601阅读 1,109评论 0 8