1 Star 5 Fork 1

littleboyck/front

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
jquery_self.js 4.84 KB
一键复制 编辑 原始数据 按行查看 历史
littleboyck 提交于 2021-10-20 23:02 . c
(function(global,factory){
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global = global || self, global.$ = factory());
}(this,function(){
let $ = function(selector,context){
return new init(selector,context)
}
$.extend = function(isDeep,target){
let args = Array.from(arguments);
if(typeof isDeep != 'boolean'){
return Object.assign.apply(Object,args);
}
let dataMatcher = function(targetVal,value){
let insObj = null;
if(value instanceof RegExp){
insObj = new RegExp(value.source,value.flags)
}else if(value instanceof Date){
insObj = new Date(value);
}else if(value instanceof Array){
insObj = targetVal||[];
}else{
insObj = targetVal||{};
}
return insObj;
}
, deepClone = function(target,obj){
Object.keys(obj).forEach(key=>{
let value = obj[key];
if(typeof value == 'object' && value != null){
let insObj = dataMatcher(target[key],value);
target[key] = deepClone(insObj,value)
}else{
target[key] = value;
}
})
return target;
}
args.slice(2).forEach(obj=>{
deepClone(target,obj);
})
return target;
}
$.each = function(set,callback){
return [].map.call(set,function(el,i){
callback.call(el,el,i)
return el;
})
}
,init = function(selector,context){
if(!selector){return this}
let dataTypes = {
'string':function(){
this.selector = selector;
saveDom.call(this,$(this.context).find(selector))
}
,'object':function(){
saveDom.call(this,selector)
}
,'el':function(){
this[0] = selector
this.length = 1;
}
}
,saveDom = function(nodeList){
Object.assign(this,nodeList)
this.length = nodeList && nodeList.length || 0;
}
this.context = context||document;
dataTypes[selector.nodeType ? 'el' : typeof(selector)].call(this)
return this;
}
,arrayProxy = Object.create(Array.prototype);
$.fn = $.prototype = arrayProxy;
$.extend($.fn,{
constructor:$
,each(callback){
return $($.each(this,callback));
}
,find(selector){
let doms = []
this.each(function(el){
let els = this.querySelectorAll(selector)
doms.push(...els)
})
return $(doms)
}
,evtListener(evtName,callback){
this.each(function(){
this.addEventListener(evtName,callback);
})
}
//因为click有300ms延迟,为了避免这300ms延迟,就模拟一个click,避免这300ms延迟。
//300ms延迟原因:想判断用户是双击屏幕还是单击。当用户第一次单击屏幕时,程序会等待300ms判断用户是否再次单击屏幕,若成立则认为是双击屏幕,放大网页。
,tap(callback){
return this.each(function(el){
let sT,eT,sX,sY,eX,eY;
$(this).evtListener('touchstart',function(e){
//阻止默认行为,如a标签跳转,内容滚动
e.preventDefault();
sT = new Date().getTime();
sX = e.changedTouches[0].pageX;
sY = e.changedTouches[0].pageY;
})
$(this).evtListener('touchend',function(e){
eT = new Date().getTime();
eX = e.changedTouches[0].pageX
eY = e.changedTouches[0].pageY;
//触摸开始到结束的时间间隔小于160毫秒,并且位置移动不超过25
if(eT - sT <= 250 && Math.abs(eX - sX) < 15 && Math.abs(eY - sY) < 15){
callback.call(this,e)
}
})
})
}
,doubleTap(callback){
let curT,prevT;
this.each(function(el){
this.evtListener('touchstart',function(e){
e.preventDefault();
curT = new Date().getTime();
!prevT && (prevT = curT)
if(curT - prevT <= 300 && curT - prevT > 0){
callback.call(this,e);
}
prevT = curT;
})
})
}
})
init.prototype = $.fn;
return $;
}));
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
JavaScript
1
https://gitee.com/littleboyck/front.git
git@gitee.com:littleboyck/front.git
littleboyck
front
front
master

搜索帮助