jQuery学习
jQuery的设计模式
-
不用 new 的构造函数
-
重载:$(支持多种参数)
-
用闭包隐藏细节
-
getter / setter:$div.text() 即可读也可写
-
$.fn 是 $.prototype 的别名
-
适配器:jQuery 针对不同浏览器使用不同代码
jQuery 如何获取元素
jQuery 通过基础的 DOM api document.querySelectorAll
获取元素
1 2 3 4 5 6 7 8 9 10
| $('#xxx') $('#xxx').find('.red') $('#xxx').parent() $('#xxx').children() $('#xxx').siblings() $('#xxx').index() $('#xxx').next() $('#xxx').prev() $('.red').each(fn)
|
部分代码实现
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 32 33 34 35 36 37
| find(selector) { let array = []; for (let i = 0; i < this.elements.length; i++) { array = array.concat( Array.from(this.elements[i].querySelectorAll(selector)) ); } array.oldApi = this; return jQuery(array); }, each(fn) { for (let i = 0; i < this.elements.length; i++) { fn.call(null, this.elements[i], i); } return this; }, parent() { const array = []; this.each((node) => { if (array.indexOf(node.parentNode) === -1) { array.push(node.parentNode); } }); return jQuery(array); }, children() { const array = []; this.each((node) => { array.push(...node.children); }); return jQuery(array); }, get(index) { return this.elements[index]; },
|
jQuery 的链式操作
1
| $('#xxx').children().find('red').each(fn)
|
通过不断的返回一个api对象,使得代码能立即调用下一个api,这就是链式操作
jQuery 如何创建元素
1 2
| $('<div><span>1</span></div>')
|
通过判断输入的参数的第一个字符是否为<
来判断是不是HTML语法,如果是,则调用了一个createElement
函数,该函数通过 DOM api 创建元素
代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| window.$ = window.jQuery = function (selectorOrArrayOrTemplate) { let elements; if (typeof selectorOrArrayOrTemplate === "string") { if (selectorOrArrayOrTemplate[0] === "<") { elements = [createElement(selectorOrArrayOrTemplate)]; } else { elements = document.querySelectorAll(selectorOrArrayOrTemplate); } } else if (selectorOrArrayOrTemplate instanceof Array) { elements = selectorOrArrayOrTemplate; } function createElement(string) { const container = document.createElement("template"); container.innerHTML = string.trim(); return container.content.firstChild; } }
|
jQuery 如何移动元素
1 2
| $('#div').appendTo(document.body)
|
代码实现:
1 2 3 4 5 6 7 8
| appendTo(node) { if (node instanceof Element) { this.each((el) => node.appendChild(el)); } else if (node.jquery === true) { this.each((el) => node.get(0).appendChild(el)); } },
|
jQuery 如何修改元素的属性
1 2 3 4 5 6 7
| $div.text('xxx') $div.html('xxx') $div.attr('title', 'xxx') $div.css({color: 'red'}) $div.addClass('blue') $div.on('click', fn) $div.off('click', fn)
|
部分代码实现:
1 2 3 4 5 6 7
| addClass(className) { for (let i = 0; i < this.elements.length; i++) { this.elements[i].classList.add(className); } return this; }
|