假如我们有一个需求,需要给元素添加样式类,使用原生的JS很容易搞定。

1 抽取函数

function addClass(node, className){
node.classList.add(className)
}
// 使用
var element = document.querySelector('#div1')
addClass(element, 'active')

2 引入命名空间

function addClass(node, className){
node.classList.add(className)
} var dom = {}
dom.addClass = addClass // 使用
var element = document.querySelector('#div1')
dom.addClass(element, 'active')

在线预览

3 把 Node 放在前面

1. 使用原型, 侵入式

Node.prototype.addClass = function(className){
this.classList.add(className)
} // 使用
var element = document.querySelector('#div1')
element.addClass('active')

在线预览

2.使用构造函数,非侵入式

function Node2(node) {
return {
element: node,
addClass: function(className) {
node.classList.add(className)
}
}
} var element = document.querySelector('#div1')
var node2 = Node2(element)
node2.addClass('active')

4 完成简化版的 jQuery

将构造函数Node2的名称替换成 jQuery

function jQuery(node) {
return {
element: node,
addClass: function(className) {
node.classList.add(className)
}
}
} var element = document.querySelector('#div1')
var node2 = jQuery(element)
node2.addClass('active')
// 给一个别名 $
window.$ = jQuery; // 将上面的代码合并成一行后,是不是已经很像了
$(document.querySelector('#div1')).addClass('active')

5 继续优化,支持多个元素

window.jQuery = function(nodeOrSelector) {
var nodes = {}
// 检测传递的是元素还是一个选择器
if (typeof nodeOrSelector === 'string') {
var temps = document.querySelectorAll(nodeOrSelector); //伪数组
for (let i = 0; i < temps.length; i++) {
nodes[i] = temps[i]
}
nodes.length = temps.length
} else if(nodeOrSelector instanceof Node){
nodes = {
0: nodeOrSelector,
length: 1
}
} nodes.addClass = function(className) {
for (let i = 0; i < nodes.length; i++) {
nodes[i].classList.add(className)
}
} nodes.getText = function(){
var texts = []
for (let i = 0; i < nodes.length; i++) {
texts.push(nodes[i].textContent)
}
return texts.join('')
} nodes.setText = function(text){
for (let i = 0; i < nodes.length; i++) {
nodes[i].textContent = text
}
}
return nodes; }
window.$ = jQuery

在线预览

自己实现一个类似 jQuery 的函数库的更多相关文章

  1. 封装一个类似jquery的ajax方法

    //封装一个类似jquery的ajax方法,当传入参数,就可以发送ajax请求 //参数格式如下{ // type:"get"/"post", // dataT ...

  2. 构建一个类jq的函数库

    jqfree core var $ = function(selector, context) { return new $.fn.init(selector, context); }; $.fn = ...

  3. Jquery Easing函数库

    从jQuery API 文档中可以知道,jQuery自定义动画的函数.animate( properties [, duration] [, easing] [, complete] )有四个参数: ...

  4. Mysql 没有nvl()函数,却有一个类似功能的函数ifnull()

    今天自己无聊写了看了一个查询需求随手写了一个sql语句,发现竟然不能运行,MySQL报[Err] 1305 - FUNCTION ceshi.nvl does not exist的错.才意识到自己写的 ...

  5. 做一个类似JQuery获取DOM对象的$()

    在dom操作时,有时根据id获取单个对象.有时根据className获取多个对象.平常可能我们用两个函数来实现这两个功能.不过我将它们整合了一下,目前使用情况良好,函数如下: view source ...

  6. underscore.js 一个强大的js函数库

    Underscore提供的100多个函数,主要涉及对Collection.Object.Array.Function的操作: Collections(集合) each, map, reduce, re ...

  7. 手动模拟一个类似jquery的ajax请求

    var $ = { parms:function(obj){ var str = ''; for(var k in obj){ str +=k+'='+obj[k]+'&'; } str = ...

  8. 如何制作一个类似jquery插件的vue插件

    vue拿来写插件,会不会太那啥? 请跟我念,"不会,符合业务需求才是你的老板最想要的." 如何封装一个可以全局调用的vue插件 其原理其实相当简单,通过new Vue(vueCom ...

  9. 为开发者准备的 Android 函数库(2016 年版)

    转载:http://www.androidchina.net/5922.html第三方函数库(译者注:包括第三方提供的 SDK,开源函数库)以惊人的方式助力着 Android 开发,借助这些其他开发人 ...

随机推荐

  1. docker安装es

    下载镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:6.8.1 创建容器并映射docker run -e ES_JAVA_OP ...

  2. [POI2006]ORK-Ploughing(贪心,枚举)

    [POI2006]ORK-Ploughing 题目描述 Byteasar, the farmer, wants to plough his rectangular field. He can begi ...

  3. java四种引用类型以及使用场景详解

    每种编程语言都有自己操作内存中元素的方式,例如在 C 和 C++ 里是通过指针,而在 Java 中则是通过“引用”.在 Java 中一切都被视为了对象,但是我们操作的标识符实际上是对象的一个引用(re ...

  4. uboot tag存储主要部分代码

    https://www.cnblogs.com/pokerface/p/5217106.html     cmd_bootm.c //传递给内核的参数      int do_bootm (cmd_t ...

  5. springboot2整合logback.xml动态修改日志打印级别

    今天找bug烦到了,生产上的日志级别不能修改,非常不利于排查问题,于是想到了动态修改日志打印级别, 因为上一周把项目升级成springboot2,并且使用logback.xml管理日志打印,所以修改也 ...

  6. jquery用法初探

    JQuery选择器 JQuery选择器用于查找满足条件的元素,比如可以用$(“#控件Id”)来根据控件id获得控件的jQuery对象,相当于getElementById: 1.id 选择器   $(“ ...

  7. kafka消费组、消费者

    consumer group consumer instance 一个消费组可能有一个或者多个消费者.同一个消费组可以订阅一个或者多个主题.主题的某一个分区只能被消费组的某一个消费者消费.那么分区和消 ...

  8. 【Java】Java URLDecoder异常Illegal hex characters in escape (%)

    如果收到的HTTP请求参数(URL中的GET请求)中有一个字符串,是中文,比如“10%是黄段子”,服务器段使用URLDecoder.decode就会出现此异常.URL只能使用英文字母.阿拉伯数字和某些 ...

  9. 【2019 Multi-University Training Contest 5】

    01: 02:https://www.cnblogs.com/myx12345/p/11649221.html 03: 04:https://www.cnblogs.com/myx12345/p/11 ...

  10. Oracle11g数据库在Win系统下的安装

    首先将从Oracle官网下载的两个安装包解压到同一个文件夹下,比如解压到database. 点击setup进行安装. (1)配置安全更新 选择是(不指定邮件) (2)安装选项,选择创建和配置数据库. ...