• javascript 自定义事件


      javascript自定义事件的方式分为4个步骤;

    一、谷歌、火狐自定义JavaScript事件

      1、创建事件;

    document.createEvent('HTMLEvents');

      参数是字符串类型,表示要创建的事件类型。

    • uievents;
    • mutationevents;
    • htmlevents;

      2、初始化事件;

    ev.initEvent('listen', false, false);

      参数说明:

    • eventType:事件名称;
    • canBubble:事件是否冒泡;
    • cancelable:是否可以用 preventDefault() 方法取消事件;

      3、监听事件;

    document.addEventListener(dataavailable, handler, param3);

      参数说明:

    • dataavailable:监听的事件名称;
    • handler:处理函数;
    • param3:是否是扑获事件模型;

      4、触发事件;

    document.dispatchEvent(ev);

      参数说明:
      ev:第一步所创建的事件对象;

    <html>
    <head>
    <meta name="viewport" content="width=device-width" />
    <title>javascript自定义事件</title>
    <script type="text/javascript">
      //创建事件
      var ev = document.createEvent('HTMLEvents');
      window.onload = function () {
        //初始化事件
        ev.initEvent('listen', false, false);
        //监听事件与绑定处理函数
        document.addEventListener("listen", function (e) {
          alert("事件被触发!");
        }, false);
      }
    </script>
    </head>
    <body>
      <div>
        <input type="button" value="触发" onclick="document.dispatchEvent(ev);" />
      </div>
    </body>
    </html>

    2016-05-25补充:移除监听removeEventListener及ev.stopPropagation()

    <html>
    <head>
    <meta name="viewport" content="width=device-width" />
    <title>javascript自定义事件</title>
    <script type="text/javascript">
      //创建事件
      var ev = document.createEvent('HTMLEvents');
    
        function myFun1(e) {
        alert("事件被触发11!");
      }
    
        function myFun2(e) {
        alert("事件被触发22!");
      }
    
      window.onload = function () {
        //初始化事件
        ev.initEvent('listen', false, false);
        //监听事件与绑定处理函数
        document.addEventListener("listen", myFun1, false);
            document.addEventListener("listen", myFun2, false);
      }
    
    </script>
    </head>
    <body>
      <div>
        <input type="button" value="触发" onclick="document.dispatchEvent(ev);" />
           <input type="button" value="移除" onclick='document.removeEventListener("listen", myFun1, false);' />
      </div>
    </body>
    </html> 

      上面是移除myFun1的监听,事件依然触发,myFun2的监听依然可以监听到。而且,如果是用匿名函数添加的监听,怎么移除呢?这是个问题。知道的请告诉我。

      如果要移除全部的监听,逐一移除监听是可行方法之一。还有就是,让事件不再派发,如上面的

    <input type="button" value="停止派发" onclick='ev.stopPropagation()' />

      这样写,单击了停止派发按钮后,事件就不再派发,全部监听都不会再接收到此事件对象的派发。

      Event的属性非常多,比如时间戳,是否冒泡等,不同的属性又可以实现不同的功能,有兴趣的可以了解下Event对象的更多属性

    二、IE自定义JavaScript事件

      注意,以上方式只适用于谷歌,如果希望IE也能够兼容,要并上兼容IE的方式。
      其中谷歌与IE的对应关系为:
      谷歌、火狐 IE

    createEvent、initEvent    createEventObject
    addEventListener    attachEvent
    dispatchEvent    fireEvent

      IE自定义事件示例:

    <html>
    <head>
    <meta name="viewport" content="width=device-width" />
    <title>javascript自定义事件</title>
    <script type="text/javascript">
      //创建事件
      var ev = document.createEventObject();
    
      window.onload = function () {
        document.attachEvent('ondataavailable',function () { 
          alert("IE事件触发!"); //IE
        }
        ); 
      }
    </script>
    </head>
    <body>
      <div>
        <input type="button" value="触发" onclick="document.fireEvent('ondataavailable', ev);" />
      </div>
    </body>
    </html>

    三、兼容谷歌火狐IE的自定义事件

      要兼容谷歌火狐IE,那么按照上面的逻辑,那就是先判断一下,如果是低版本IE,那么就使用低版本IE的函数或对象,否则就使用谷歌的事件对象。

    <html>
    <head>
    <meta name="viewport" content="width=device-width" />
    <title>javascript自定义事件</title>
    <script type="text/javascript">
      //创建事件
      var HtmlEvent;
      if (document.createEvent) {
        HtmlEvent = document.createEvent('HTMLEvents'); //谷歌、火狐创建新事件的写法
        HtmlEvent.initEvent("Click", false, false);
      }
      else if (document.createEventObject) {
        HtmlEvent = document.createEventObject(); //旧版本IE的创建新事件的写法
      }
      window.onload = function () {
        //监听事件与绑定处理函数
        if (document.addEventListener) {
          document.addEventListener('Click', function (e) {
            alert("谷歌火狐、事件被触发!"); //谷歌火狐的触发事件
          }, false);
        } 
        else if(document.attachEvent) {
          document.attachEvent('ondataavailable', function () { 
            alert("IE事件触发!"); }); //IE
          }
        }
      }
    
      function fire()
      {
        if (document.dispatchEvent) {
          document.dispatchEvent(HtmlEvent);
        }
        else if (document.fireEvent) {
          document.fireEvent('ondataavailable', HtmlEvent);
        }
      }
    </script>
    </head>
    <body>
      <div>
        <input type="button" value="触发" onclick="fire()" />
      </div>
    </body>
    </html>

    四、触发事件时向Listen传参

      传参的方式很简单,直接在参数赋值在事件Event对象上就OK了,什么格式的都可以。

    <html>
    <head>
    <meta name="viewport" content="width=device-width" />
    <title>javascript自定义事件</title>
    <script type="text/javascript">
      //定义一个事件
      var ev = document.createEvent('HTMLEvents');
      window.onload = function () {
        //初始化事件
        ev.initEvent('listen', false, false);
    
        //监听事件与绑定处理函数
        document.addEventListener("listen", function (e) {
          alert("传过来的参数:" + e.name);
          }, false);
        }
    
        function fire()
        {
          ev.name = "刘备";
          document.dispatchEvent(ev);
        }
        </script>
      </head>
      <body>
        <div>
          <input type="button" value="触发" id="btn1" onclick="fire()" />
        </div>
      </body>
    </html>

    五、jQuery的自定义事件的绑定与触发

    jQuery绑定与触发自定义事件更加方便,而且兼容性更好。

    <!DOCTYPE html>
    <html>
    <head>
    <script src="http://libs.baidu.com/jquery/1.10.2/jquery.min.js">
    </script>
    <script>
        $(document).on("listen",function(event,a,b){
            alert(a + " " + b);
        });
    
        //第一个是自定义的事件名
        //第二个参数是一个数组
        //数组中的项会和自定义事件中回调的参数项对应
          $(function(){
          $('#btn1').click(function(){
              $(document).trigger("listen",["aa","bb"])
          });
        })
    </script>
    </head>
    <body>
        <input type="button" id="btn1"  value="触发"  />
    </body>
    </html>
  • 相关阅读:
    springboot日期格式转换
    通过nginx访问本地图片
    终止线程池对应某个线程
    下载文件并将下载成功的文件考入另一个目录
    centos7安装mysql5.7
    java dwg转svg
    PostgreSQL 实现按月按年,按日统计 分组统计
    oracle查询语句,根据中文的拼音排序
    java操作solr
    AMD,CMD,UMD 三种模块规范 写法格式
  • 原文地址:https://www.cnblogs.com/kissdodog/p/4892239.html
Copyright © 2020-2023  润新知