
麦子学院 2017-07-30 23:31
Javascript学习之事件库的封装详解
回复:0 查看:2378
在浏览器中,对于事件的操作,兼容性主要是存在
DOM2
级事件里面,标准浏览器是通过
addEventListener()
和
removeEventListener()
来注册事件和绑定事件,在低级版本的
IE浏览器
里面是有对应的
attachEvent()
和
detachEvent()
;再者是里面传入的事件行为,标准的不带
on
,
IE
带
on
;接着是事件处理函数里面的
this
指向;事件重复绑定的问题,事件绑定顺序与执行顺序的问题
//
事件绑定的元素,事件类型,事件处理函数
function
on(ele,
type,fn){
//
区分浏览器
if(ele.addEventListener){
ele.addEventListener(
type,fn,false);//
冒泡
}
else{ // IE6-8
if(!ele['on'+
type]){
ele['on'+
type]=[];
//
解决
run
被重复绑定的问题
ele.attachEvent('on'+
type,
function(){
run.call(ele);
})
}
//
去重判断,解决重复绑定的问题
for(
var i=0;i<ele['on'+
type].length;i++){
if(a
===fn) return;
}
ele['on'+type].push(fn);
}
}//拿到"数组"中的每个方法,进行顺序调用 主要是针对IE浏览器的设置function run(){
var e=window.event;
//对事件对象做兼容处理
e.target=e.srcElement; // 事件源
e.pageX=(document.documentElement.scrollLeft||document.body.scrollLeft)+e.clientX; // clientX/Y:鼠标点击的位置距离可视区页面左上角的距离 scrollLeft:是滚动条滚动的距离(IE兼容处理),pageX/Y:鼠标在页面上的位置,从页面左上角开始,即是以页面为参考点,不随滑动条移动而变化
e.pageY=(document.documentElement.scrollTop||document.body.scrollTop)+e.clientY;
e.preventDefault=function(){//阻止默认事件
e.returnValue=false;
};
e.stopPropagation=function(){
e.cancelBubble=true;//阻止冒泡;
};
// this是指向ele
var a=this["on"+e.type];
if(a.length){//证明数组有长度,可以循环调用;
for(var i=0; i<a.length; i++){
if(typeof a==='function'){
a.call(this,e);//fn1 fn2 fn3
}else{
a.splice(i,1); // 移除
i--; // 防止数组塌陷
}
}
}
}
//从"数组"中找到要"解除绑定"的方法,赋值为nullfunction off(ele,type,fn){
if(ele.removeEventListener){
ele.removeEventListener(type,fn,false);
}else{
//拿到数组,遍历判断,并赋值为null
var a=ele["on"+type];
for(var i=0; i<a.length; i++){
if(a===fn){
a=null;
break;
}
}
}
}
来源:简书