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.prototype
Object.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()后返回的api
this.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;
},