vquery2023
Version:
一个轻量级的类jQuery的库,聚合了jQeury中这几个常用的方法: click() hover() show() hide() css() attr() toggle() eq find() getIndex() bind()
156 lines (133 loc) • 3.82 kB
JavaScript
function VQuery(vArg) {
this.elements = []
switch(typeof vArg) {
case 'function':
window.addEventListener('load', vArg)
break;
case 'string':
switch(vArg.charAt(0)){
case '#':
this.elements.push(document.querySelector(vArg));
break;
default:
this.elements = document.querySelectorAll(vArg);
}
break;
case 'object':
this.elements.push(vArg)
}
}
VQuery.prototype.click = function(fn) {
for(let i = 0; i < this.elements.length; i++) {
this.elements[i].addEventListener('click', fn)
}
return this
}
VQuery.prototype.hover = function(fnOver, fnOut) {
for(let i = 0; i < this.elements.length; i++) {
this.elements[i].addEventListener('mouseover', fnOver)
this.elements[i].addEventListener('mouseout', fnOut)
}
return this
}
VQuery.prototype.show = function() {
for(let i = 0; i < this.elements.length; i++) {
this.elements[i].style.display = "block"
}
return this
}
VQuery.prototype.hide = function() {
for(let i = 0; i < this.elements.length; i++) {
this.elements[i].style.display = "none"
}
return this
}
VQuery.prototype.css = function(attr, value) {
if (arguments.length == 1) {
if (typeof attr == 'string') {
// attr是一个字符串,比如"width", "height";
return getComputedStyle(this.elements[0])[attr]
} else {
// attr是一个json, 比如{"width": "200px", "height": "200px"};
for(let i = 0; i < this.elements.length; i++) {
for(let j in attr) {
this.elements[i].style[j] = attr[j]
}
}
}
} else {
for(let i = 0; i < this.elements.length; i++) {
this.elements[i].style[attr] = value
}
}
return this
}
VQuery.prototype.attr = function(attr, value) {
if (arguments.length == 1) {
return this.elements[0][attr]
} else {
for(let i = 0; i < this.elements.length; i++) {
this.elements[i][attr] = value
}
}
return this
}
VQuery.prototype.toggle = function() {
let _arguments = arguments
for(let i = 0; i < this.elements.length; i++) {
let count = 0
this.elements[i].addEventListener('click', function() {
let _this = this
_arguments[count++ % _arguments.length].call(_this) // 注意:这里一定要绑定一下this,要不然不起作用!
})
}
return this
}
VQuery.prototype.eq = function (n) {
return $(this.elements[n])
}
VQuery.prototype.find = function (str) {
let aResult = []
for(let i = 0; i < this.elements.length; i++) {
// 这里不能直接用concat方法,因为querySelectorAll选出来的是NodeList集合,是个类数组对象,而不是真正的数组,它本身没有concat方法!
// aResult = aResult.concat(this.elements[i].querySelectorAll(str))
const nodeListsArr = this.elements[i].querySelectorAll(str)
for(let j = 0; j < nodeListsArr.length; j++) {
aResult.push(nodeListsArr[j])
}
}
// aResult只是一个元素数组,如何把它变成一个VQuery对象?可以像下面这样操作:
let newVQuery = $()
newVQuery.elements = aResult
return newVQuery
}
function getIndex(obj) {
let aBrothers = obj.parentNode.children
for(let i = 0; i < aBrothers.length; i++) {
if(aBrothers[i] == obj) {
return i
}
}
}
VQuery.prototype.index = function() {
return getIndex(this.elements[0])
}
VQuery.prototype.bind = function(sEv, fn) {
for(let i = 0; i < this.elements.length; i++) {
this.elements[i].addEventListener(sEv, function(ev) {
if(false == fn.call(this)) {
ev.stopPropagation()
// ev.cancelBubble = true
ev.preventDefault()
}
})
}
}
// 添加插件方法
VQuery.prototype.extend = function(name, fn) {
VQuery.prototype[name] = fn
}
function $(vArg){
return new VQuery(vArg)
}
module.exports = $;