为了便于学习与理解jQuery,自己尝试去写一个只有两个API的简版jQuery。
什么是JQuery
jQuery是js的一个工具库,由John Resig在2006年发布。
j代表JavaScript,query是“查询”的意思。也就是说,这个库的意图是基于JavaScript的查询。
查询的目标是什么?
答案是DOM(文档对象模型)结构中的Node(节点)。一个网页就是一个html文档,而网页上的所有内容都是节点,包括文档节点、元素节点、文本节点、注释节点、属性节点等等。而jQuery的查询最主要针对的是元素节点,如段落(p)、锚点(a)、表格(table)等,只有少数方法可以处理文本节点与注释节点。同时jQuery还可以用attr方法方便地对元素节点的属性进行读取/设置。
jQuery的核心是通过各种选择器,选中DOM元素
节点或者选择器判断
由于jQuery支持传参字符串,所以先判断参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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 } } return nodes }
|
addClass方法
jQuery的addClass方法,用于为DOM元素添加一个class。
1
| $('body').addClass('hasJS');
|
DOM元素本身有一个可读写的className属性,可以用来操作class。
1 2 3 4 5
| document.body.className = 'hasJS';
// or
document.body.className += ' hasJS';
|
HTML 5还提供一个classList对象,功能更强大(IE 9不支持)。
1 2 3 4 5 6 7
| document.body.classList.add('hasJS');
document.body.classList.remove('hasJS');
document.body.classList.toggle('hasJS');
document.body.classList.contains('hasJS');
|
自己动手实现addClass方法
1 2 3 4 5
| nodes.addClass = function(classes) { for (let i = 0; i < nodes.length;i++) { nodes[i].classList.add(classes) } }
|
setText方法
改变textContent的值
1 2 3 4 5
| nodes.setText = function(text) { for (let i = 0; i < nodes.length; i++) { nodes[i].textContent = text } }
|
完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| 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 } } nodes.addClass = function(classes) { for (let i = 0; i < nodes.length;i++) { nodes[i].classList.add(classes) } } nodes.setText = function(text) { for (let i = 0; i < nodes.length; i++) { nodes[i].textContent = text } } return nodes } window.$ = jQuery
var $div = $('div') $div.addClass('red') // 可将所有 div 的 class 添加一个 red $div.setText('hi') // 可将所有 div 的 textContent 变为 hi
|
参考资料:阮一峰-如何做到jQuery