jQuery创建元素,获取元素:
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;return container.content.firstChild;}const api = Object.create(jQuery.prototype);//将api的原型指向jQuery.prototypeObject.assign(api, {//将后面的一个匿名对象复制到目标对象(api),返回新的目标对象elements: elements,oldApi: selectorOrArrayOrTemplate.oldApi,});return api;};
链式操作:
最终选中网页元素以后,可以对它进行一系列操作,并且所有操作都可以连在一起,以链条的形式写出来
它的原理在于每一步的jQuery操作,返回的都是一个jQuery对象,所以不同操作可以连在一起。
$("div")//调用结果返回一个api.addClass("red")//调用结果返回调用该函数的api,使这个api依旧可以操控这些元素.addClass("green").print()
移动元素:
append()和appendTo():在现存元素的内部,从后面加入元素
append()是参数方加入到调用方元素的内部
appendTo()是调用方加入到参数方元素的内部
appendTo(node) {//调用方加入参数方if (node instanceof Element) {this.each((el) => node.appendChild(el));} else if (node.jquery === true) {//判断node是否为调用jquery()后返回的apithis.each((el) => node.get(0).appendChild(el));//如果是,就往node可操纵的第一个元素里添加子元素//添加的子元素为调用appendTo方法的api所操纵的元素}},append(children) {//参数方加入调用方if (children instanceof Element) {this.get(0).appendChild(children);} else if (children instanceof HTMLAllCollection) {for (let i = 0; i < children.length; i++) {this.get(0).appendChild(children[0]);}} else if (children.jquery === true) {children.each((node) => this.get(0).appendChild(node));}},
修改元素属性:
attr( nameOrObject, value) {//重载:根据传入参数数量或类型来决定具体执行if(nameOrObject instanceof Object){this.each((node)=>{for(let key in nameOrObject ){node.setAttribute(key,nameOrObject[key])}})}else if (arguments.length === 2) {this.each((node)=>node.setAttribute(name, value))}return this}
添加元素的class属性值:
addClass(className) {for (let i = 0; i < this.elements.length; i++) {const element = this.elements[i];element.classList.add(className);//并不覆盖原有class的值}return this;},
