js之自定义事件

js可以自己制定自定义事件,大致分为两种,DOM自定义事件和js自定义事件,下面上例子:

1.DOM自定义

比如我现在有一个需求,某一个按钮根据按下鼠标左键的时间不同来执行不同的响应,我们这里可以自己去定义事件来实现。

html结构如下:

<body>
<input  class="btn" type="button" value="click">
<script src="selfDomEvents.js"></script>
<script src="script.js"></script>
</body>

selfDomEvent.js如下:


/**
 * Created by Administrator on 2017/6/14 0014.
 */
(function(window,undefined){
    var lastTime;
    var selfEvt1=document.createEvent("Event");
    var selfEvt2=document.createEvent("Event");
    selfEvt1.initEvent("longMouseDown",true,true);
    selfEvt2.initEvent("shortMouseDown",true,true);
    document.getElementsByClassName("btn")[0].addEventListener("mousedown",function(){
        lastTime=Date.now();
    });
    document.getElementsByClassName("btn")[0].addEventListener("mouseup",function(){
        var interval=Date.now()-lastTime;
        selfEvt1.interval=selfEvt2.interval=interval;
       if(interval>1000){
           document.getElementsByClassName("btn")[0].dispatchEvent(selfEvt1);
       }else{
           document.getElementsByClassName("btn")[0].dispatchEvent(selfEvt2);
       }
    });



})(window)

可以看到上述定义了俩种事件,根据按下和弹起的时间间隔来调度不同的响应,响应的event里包含了时间差。

接下来是script.js

/**
 * Created by Administrator on 2017/6/14 0014.
 */
document.getElementsByClassName("btn")[0].addEventListener("longMouseDown",function(e){
   var ti= (e.interval/1000).toFixed(2);
    console.log("你已经长按了"+ ti+"秒");
});
document.getElementsByClassName("btn")[0].addEventListener("shortMouseDown",function(e){

    var ti= (e.interval/1000).toFixed(2);
    console.log("你已经短按了"+ ti+"秒");
});

当快速点击和长按点击会有不同输出:
//你已经短按了0.78秒
//你已经长按了1.64秒

2.js自定义

先上代码:

/**
 * Created by Administrator on 2017/6/14 0014.
 */
var DefineEvent=function(){
    this.handlers={};
}
DefineEvent.prototype={
    construct:"DefineEvent",
    addEventListener:function(type,func){
        if(this.handlers[type]!==undefined){
            this.handlers[type].push(func);
        }else{
            this.handlers[type]=[func];
        }
    },
    fire:function(data){
         var type=data.type;
        if(this.handlers[type]){
            for(var i=0;i<this.handlers[type].length;i++ ){
                this.handlers[type][i](data.params);
            }
        }
    },
    removeEventListener:function(type,func){
        if(!this.handlers[type]){
            throw("no this func to be removed!");
            return ;
        }


           for(var i=0;i<this.handlers[type].length;i++){
                if(this.handlers[type][i]===func){
                    this.handlers[type].splice(i,1);
                }
           }
    }
};



function bar(data){
var res= Math.sqrt( Math.pow(data.x,2)+Math.pow(data.y,2));
console.log(res);
}

var test=new DefineEvent();
test.addEventListener("myEvt1",bar);
test.fire({"type":"myEvt1","params":{"x":6,"y":8}});//10

写一个构造函数,然后在原型对象上定义三个方法,分别是添加监听,执行,移除监听。而实例的handlers属性是一个对象,其中每一个键代表事件名称,而对应的值是一个数组,里面保存所有的监听方法。

记录备忘

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值