- 比较久之前写的了,仅作为参考或思想扩展。
- 此仿写忽略了兼容问题。
- 用法基本和jQuery相同。
- 方法还有一些局限性,需要自行体会,本文仅是展示jQ的核心思想。
window.$ = function(selector,context){
return new jQ(selector,context);
}
var jQ = function(selector, context){
context = context || document;
this.elements = context.querySelectorAll(selector);
this.length = this.elements.length;
return this;
}
jQ.prototype.each = function(fn){
for (let i = 0; i < this.length; i++) {
fn(this.elements[i], i);
}
return this;
}
jQ.prototype.on = function(eventType, fn){
return this.each((item)=>{
item.addEventListener(eventType,fn,false);
});
}
jQ.prototype.attr = function (attr, val) {
if(!val){
return this.elements[0][attr];
}
return this.each((item)=>{
item.setAttribute(attr, val);
});
}
jQ.prototype.addClass = function(addClass) {
return this.each((item)=>{
let className = item.getAttribute("class") || '';
let str = ' ' + className + ' ';
if(str.indexOf(' ' + addClass + ' ') == -1){
let newClass = className ? (className + ' ' + addClass) : addClass;
item.setAttribute("class", newClass)
}
});
}
jQ.prototype.removeClass = function(removeClass) {
return this.each((item)=>{
let className = item.getAttribute("class");
if(className){
let arr = className.split(' ');
for (let i = 0; i < arr.length; i++) {
if(arr[i] == removeClass){
arr.splice(i,1)
item.setAttribute("class", arr.join(" "));
break;
}
}
}
});
}