zoukankan      html  css  js  c++  java
  • js自定义事件CustomEvent、Event、TargetEvent

    1、Event

    Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。

    事件通常与函数结合使用,函数不会在事件发生前被执行!

    Event的事件都是系统自带事件,比如鼠标、键盘、焦点等等!

    可以用Document.createEvent(type) 方法创建自定义事件,type 是一个字符串,表示要创建的事件类型。事件类型可能包括"UIEvents""MouseEvents""MutationEvents", 或者 "HTMLEvents"。

    只有在新创建的 Event 对象被 Document 对象或 Element 对象的 dispatchEvent() 方法分派之前,才能调用 Event.initEvent() 方法:

    实例:

    //自定义事件
                var mdiv = document.getElementById("mydiv");
                var myEvent = document.createEvent("HTMLEvents");
                myEvent.data = "Hello world";
                myEvent.initEvent("myOwnEvent",true,true);
                mydiv.addEventListener("myOwnEvent",function(e){
                    console.log("我是自定义事件");
                    console.log(e.data);
                },false);
                mydiv.dispatchEvent(myEvent);

    输出

     由此可见,通过createEvent创建自定义事件比较局限,但也可满足大部分需求!

    2、CustomEvent

    这个应该是自定义事件的标准格式,如果需要用到自定义事件,推荐!

    构造函数CustomEvent(eventName, params) 第一个参数是事件名称,用来区分事件,必填,第二个是参数,需要注意的是,params必须是{detail:{data:data}}格式!

    实例

    //自定义事件
                var mdiv = document.getElementById("mydiv");
                var eventName = "MY_EVENT";
                var myEvent = new CustomEvent(eventName,{detail:{data:"Hello myEvent"}});
                mdiv.addEventListener(eventName,function(evt){
                    console.log(evt.detail.data);
                });
                mydiv.onclick = function(){
                    mydiv.dispatchEvent(myEvent);
                }

    运行点击div则输出

    这种自定义事件方式简单,而且比较自由!

    3、TargetEvent

    MDN:

    EventTarget是一个由可以接收事件的对象实现的接口,并且可以为它们创建侦听器。

    Elementdocument 和 window 是最常见的事件目标,但是其他对象也可以是事件目标,比如XMLHttpRequestAudioNodeAudioContext 等等。这个事件功能比较强大,个人觉得可以任意妄为,哈哈

    实例

    //自定义事件
                function EventTarget(){
                    this.handlers = {};
                }
                EventTarget.prototype = {
                    constructor:EventTarget,
                    addHandler:function(type,handler){
                        if(typeof this.handlers[type] == 'undefined'){
                            this.handlers[type] = [];
                        }
                        this.handlers[type].push(handler);
                    },
                    removeHandler:function(type,handler){
                        if(this.handlers[type] instanceof Array){
                            var arr = this.handlers[type];
                            for(var i = 0,len = arr.length;i < len;i++){
                                if(arr[i] == handler){
                                    arr.splice(i,1);
                                }
                            }
                        }
                    },
                    dispatchEvent:function(event){
                        if(!event.target){
                            event.target = this;
                        }
                        if(this.handlers[event.type] instanceof Array){
                            var arr = this.handlers[event.type];
                            for(var i = 0,len = arr.length;i < len;i++){
                                arr[i](event);
                            }
                        }
                    }
                }
                
                var mdiv = document.getElementById("mydiv");
                var eventName = "MY_EVENT";
                var myEvent = new EventTarget();
                myEvent.addHandler(eventName,function(evt){
                    console.log(evt.message);
                });
                myEvent.dispatchEvent({type:eventName,message:"触发成功"});

    这里摘抄了一位网友的封装,大部分就是这个意思,这个相当于重写EventTarget类,重新封装下!

    运行结果:

    这里我们看到了,其实可以随意传递data,这个自定事件的封装比较牛叉,范围比较广,几乎可以应对一切自定义事件的需求,几近完美!

    综上总结了js三种自定义事件的方式,无穷无尽而又完美无暇的宇宙,请赐我最完美的结论吧!奥!

  • 相关阅读:
    Realtime crowdsourcing
    maven 常用插件汇总
    fctix
    sencha extjs4 command tools sdk
    首次吃了一颗带奶糖味的消炎药,不知道管用不
    spring mvc3 example
    ubuntu ati driver DO NOT INSTALL recommand driver
    yet another js editor on windows support extjs
    how to use springsource tools suite maven3 on command
    ocr service
  • 原文地址:https://www.cnblogs.com/wangzisheng/p/10021909.html
Copyright © 2011-2022 走看看