jQuery 的简易实现思路

作者: 许骁Charles | 来源:发表于2019-04-05 16:08 被阅读40次

概述

总所周知,jQuery是一个早期非常强大的js库,它小巧、快速、特性丰富,它在HTML的文档遍历、DOM操作,事件冒泡,动画以及AJAX使用方面提供了非常便捷易用的API。本文从学习的角度简要分析jQuery的封装机制。

实现思路

当给定需求如下:

window.jQuery = ???
window.$ = jQuery

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

在只知道常用DOM API的情况下,为了模拟一个简易jQuery的封装机制,首先能想到的是在Node的原型上添加方法addClasssetText,但这样就破坏了DOM本身的封装,并不是一个好方法。更好的思路是设计一个新的函数来对原node添加装饰功能并返回。具体如下:

(1)version 1.0:

window.jQuery = function (node1) {
          var node = node1

            node.addClass = function (className) {
                node.classList.add(className)
            }

            node.setText = function (text) {
                node.textContent = text
            }

            return node
        }

(2)version 2.0:类型检测(传入字符串或节点对象)

window.jQuery = function (node1) {
            var node

            if (typeof node1 === "string") {
                node = document.querySelector(node1)
            } else {
                node = node1
            }

            node.addClass = function (className) {
                node.classList.add(className)
            }

            node.setText = function (text) {
                node.textContent = text
            }

            return node
        }

(3)version 3.0: 支持操作多个元素

window.jQuery = function (node1) {
            var node

            if (typeof node1 === "string") {
                node = document.querySelectorAll(node1)
            } else {
                node = {}
                node[0] = node
                node["length"] = 1
            }

            node.addClass = function (className) {
                for (var i = 0; i < node.length; i++) {
                    node[i].classList.add(className)
                }
            }

            node.setText = function (text) {
                for (var i = 0; i < node.length; i++) {
                    node[i].textContent = text
                }
            }

            return node
        }

(4)version 4.0:优化代码

 window.jQuery = function (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
                }

            }

            // 同时添加多个类(classes可以是一个字符串,也可以是一个数组集合了需要添加的类)
            nodes.addClass = function (classes) {

                if (typeof classes === "string") {
                    for (let i = 0; i < nodes.length; i++) {
                        nodes[i].classList.add(classes)
                    }
                } else if (classes instanceof Array) {
                    classes.forEach(value => {
                        for (let i = 0; i < nodes.length; i++) {
                            nodes[i].classList.add(value)
                        }
                    })
                }
            }

            nodes.setText = function (text) {
                for (let i = 0; i < nodes.length; i++) {
                    nodes[i].textContent = text
                }
            }

            return nodes
        }

在4.0版里,我们能够得到

  • 更纯净的node(原型链里不再有Node.prototype
  • 可同时添加多个类的addClass方法,接受的参数可以是一个字符串,即添加一个类,也可以是多个类组成的数组(因为错误处理我还没了解,所以其他类型抛出错误现在没有实现)
  • 同时给得到的所有节点添加文字内容的setText方法

总结

以上的过程,旨在学习jQuery的封装机制。即jQuery是一个构造函数,它封装了原生js的属性和方法,以更于易用的api供我们使用。本文是对jQuery的一个简易版实现,理解了其中的原理,对于我们学习其他框架也是大有裨益的。

相关文章

  • jQuery 的简易实现思路

    概述 总所周知,jQuery是一个早期非常强大的js库,它小巧、快速、特性丰富,它在HTML的文档遍历、DOM操作...

  • jQuery的实现思路

    首先我们来看下封装函数的两种方式 上面两种方法封装的函数的node如果想放到前面 如上代码所示这样调用的话该如何做...

  • 手写一个简易的Jquery考虑插件及扩展性

    通过手写一个简易的DOM节点查询功能的Jquery实例,了解Jquery内部实现原理及理解Class与继承。 页面...

  • 0528--RPC简易实现

    RPC 主要实现远程过程调用 一、实现思路 二、简易实现 RPCServer 接口 RPCServerImpl 实...

  • 堡垒机

    目录 一、堡垒机介绍二、搭建简易堡垒机思路三、搭建简易堡垒机 - 安装jailkit实现chroot四、搭建简易堡...

  • 二十多行代码实现一个简易 jQuery

    二十多行代码实现一个简易 jQuery 先写一个叫 jQuery 的构造函数,并且将它作为全局变量,方便调用,并且...

  • jQuery基本实现思路

    转载来至方应杭github 1 JS 基本知识 1.1 数组属于对象吗?1.2. 函数属于对象吗?1.3. 给数...

  • 从零开始的jQuery插件封装

    jQuery插件简易封装方法。 jQuery插件机制 jQuery.extend( [deep ], target...

  • 2019-03-15

    ①基于layui select的实时搜索组件(重写layui select)。实现思路:通过jquery的inpu...

  • 手写Netty版本的简易tomcat以及实现部分SpringMV

    手写Netty版本的简易tomcat以及实现部分SpringMVC功能 实现思路 首先加载配置文件。 将配置文件中...

网友评论

    本文标题:jQuery 的简易实现思路

    本文链接:https://www.haomeiwen.com/subject/eaihiqtx.html