博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS事件类方法
阅读量:6655 次
发布时间:2019-06-25

本文共 3064 字,大约阅读时间需要 10 分钟。

1.添加事件

var addEventHandler=function(oTarget,sEventType,fnHandler){

  if(oTarget.addEventListener){

    oTarget.addEventListener(sEventType,fnHandler,false);

  }else if(oTarget.attachEvent){

    oTarget.attachEvent("on"+sEventType,fnHandler);

  }else{

      oTarget["on"+sEventType]=fnHandler;

    }

};

2.移除事件

var removeEventHandler=function(oTarget,sEventType,fnHandler){

  if(oTarget.removeEventListener){

    oTarget.removeEventListener(sEventType,fnHandler,false);

  }else if(oTarget.detachEvent){

    oTarget.detachEvent("on"+sEventType,fnHandler);

  }else{

    oTarget["on"+sEventType]=null;

  }

};

3.事件处理 Bind

var BindAsEventListener=function(object,fun){

  var args=Array.prototype.slice.call(arguments).slice(2);

  return function(event){

    return fun.apply(object,[event|| window.event].contact(args));

  }

}  

//我们知道,Array.prototype.slice.call(arguments)能将具有length属性的对象转成数组,除了IE下的节点集合(因为ie下的dom对象以com对象的形式实现的。)

 var a={length:2,0:'first',1:'second'};

Array.prototype.slice.call(a);//["first","second"]

var a={length:2};

Array.prototype.slice.call(a);//[undefined,undefined]

首先,slice有两个用法,一个是String.slice,一个是Array.slice,第一个返回的是字符串,第二个返回的是数组,这里我们看第二个。

Array.prototype.slice.call(arguments)能够将arguments转成数组,那么就是arguments.toArray().slice();到这里,是不是就可以说Array.prototype.slice.call(arguments)的过程就是先将传进来的第一个参数转为数组,在调用slice?

这里我们可以大胆猜想slice的内部实现,如下  

Array.prototype.slice=function(start,end){

  var result=new Array();

  start=start||0;

  end=end||this.length;//this指向调用的对象

  for(var i=start;i<end;i++){

    result.push(this[i]);

  }

  return result;

}

//使用

var Test=function(){

  this.init();

};

Test.prototype={

  init:function(){

    this.name="test";

    this.btn=document.getElementById("test");

    this._fc=BindAsEventListener(this,this._doClick,'bind event');

    addEventHandler(this.btn,"click",this._fc);

  },

  _doClick:function(e,str){

    e.preventDefault();

    alert(this.name+' '+str);

  },

  destory:function(){

    removeEventHandler(this.btn,"click",this._fc);

  }

}

//事件代理:

var Delegate=function(parent,eventType,selector,fn,that){

  eventType=eventType||"click";

  if(!parent){

    return;

  }

  if(typeof selector !=="function"){

    return;

  }

  if(typeof selector !=="string"){

    return;

  }

  var handle=function(e){

    var evt=window.event?window.event:e;

    var target=evt.target||evt.srcElement;

    target=getDlgElement(target);

    if(target){

      fn.call(that,{target:target,event:e});

    }

  };

  var getDlgElement=function(ele){

    if(!ele){

      return null;

    }

    return ((ele.id===selector)||

        (ele.className && ele.className.indexOf(selector)!=-1))?ele:getDlgElement(ele.parentNode);

  };

  parent["on"+eventType]=handle;

};

 

var Test2=function(){

  this.init();

};

Test2.prototype={

  init:function(){

    var me=this;

    Delegate(document,"click","classname",function(e){

      e.event.preventDefault();

      var obj=e.target;

      me.setValue(obj,"test");

    },this)

  },

  setValue:function(elem,str){

    elem:setAttribute("data-value",str);

  }

}

 

转载于:https://www.cnblogs.com/csli/p/6759162.html

你可能感兴趣的文章
Prim算法求最小生成树
查看>>
ajax请求解析springmvc返回的json数据
查看>>
【原】iOS学习42即时通信之XMPP(1)
查看>>
数组乱序排列
查看>>
oracle 密码默认180天过期
查看>>
fre7 offonline for firefox
查看>>
类linux系统/proc/sysrq-trigger文件功能作用
查看>>
一周动态
查看>>
Scrapy使用详细记录
查看>>
Python总体架构图
查看>>
Docker 入门学习
查看>>
C/C++ 笔试、面试题目大汇总(转)
查看>>
Ubuntu 16.04 + CUDA 8.0 + cuDNN v5.1 + TensorFlow(GPU support)安装配置详解
查看>>
文件比较软件有哪些
查看>>
Beyond Compare切换到浏览模式的步骤
查看>>
进程、线程与应用程序域
查看>>
莎莎的简历
查看>>
快速排序(递归与非递归形式)
查看>>
洛谷金秋夏令营模拟赛 第2场 T11737 时之终末
查看>>
汕头市队赛 SRM10 T1模拟只会猜题意
查看>>