自定义事件

前言

  除了浏览器提供的原生事件外,有时我们还需要自定义事件以满足特定的需求,比如小模块之间的通信,传递信息等。JavaScript提供了几种自定义事件的方式:

    1. Event() 构造函数, 创建一个新的事件对象 Event

    2. CustomEvent()  创建一个自定义事件

    3. document.createEvent() 创建一个新的事件(Event),随之必须调用自身的 init 方法进行初始化。

Event()

  语法 : event = new Event(typeArg, eventInit) 

  typeArg是一个表示事件类型的字符串。

  eventInit是事件的配置项:

    "bubbles",可选,Boolean类型,默认值为 false,表示该事件是否冒泡。

    "cancelable",可选,Boolean类型,默认值为 false, 表示该事件能否被取消。

    "composed",可选,Boolean类型,默认值为 false,指示事件是否会在阴影根之外

  自定义事件的监听和原生事件一样;触发的时候通过 targetDom.dispatchEvent(event)触发,看下面的栗子

//用来触发自定义事件
<button type="button" name="button" class="test">点我</button>

 

var button = document.querySelector('button');

var selfEvent = new Event('self',{ "bubbles" : true, "cancelable" : false, "composed" : false }); //监听 document.addEventListener('self',function(e){ alert('事件顺利触发啦!') }) //触发 button.addEventListener('click',function(){ document.dispatchEvent(selfEvent) //触发自定义事件 })

  需要注意的是,IE不支持该方法。

  如果自定义事件的时候,需要传递一些额外的字段,这个时候就可以用CustomEvent()

CustomEvent()

  和Event()方法类似,不过在创建的时候,CustomEventInit中多了一个detail字段,可以用来传递额外的对象,而且少了composed字段。

        触发和监听都和Event()类似,而且同样不支持IE

    //IE不支持  可携带数据
    var custom = new CustomEvent('custom',{
      "detail" : {  //可携带额外的数据
        age : 18
      },
      "bubbles" : true,
      "cancelable" : false,
    });

    //监听
    document.addEventListener('custom',function(e){
      console.log(e);
    })

    //触发
    button.addEventListener('click',function(){
      document.dispatchEvent(custom)
    })

  那么如果想要兼容IE的话,要怎么办呢?

document.createEvent()

  这种方式已经被官方声明不推荐使用了。但是浏览器都是支持的,IE也都支持

  document.createEvent('Event') 创建一个自定义事件之后,在触发事件之前一定需要进行初始化。而且要注意只能是document创建,不过使用的时候,所有元素都可以,和之前两种方式一样。

  初始化事件的时候指定事件名及能否冒泡,能否被阻止等。

    //只能是document创建  事件被触发前,必须通过initEvent()初始化   兼容性好IE支持 但是已废弃
    var create = document.createEvent('Event');
    create.initEvent('create', false, false);

    //监听
    document.addEventListener('create',function(e){
      console.log(e);
    })

    //触发
    button.addEventListener('click',function(){
      document.dispatchEvent(create)
    })

 

posted @ 2017-11-29 23:34  Shapeying  阅读(4813)  评论(1编辑  收藏  举报