zoukankan      html  css  js  c++  java
  • 关于事件监听/添加事件句柄

    IE下:

    //添加事件句柄
    function(oELement,sEvent,fnHandler){
      oELement.attachEvent('on' + sEvent,fnHandler);
    
    //取消事件句柄
    function(oElement,sEvent,fnHandler){
      oElement.detachEvent('on' + sEvent,fnHandler);
    }

    其他浏览器下(当然,只有IE8及更早的版本不支持,Opera 7.0 及 Opera 更早版本也不支持):

    //添加事件句柄
    function(oELement,sEvent,fnHandler){
      oElement.addEventListener(sEvent,fnHandler,false);
    }
    
    //取消事件句柄
    function(oELement,sEvent,fnHandler){
      oElement.removeEventListener(sEvent,fnHandler,false);
    }

    原因:

    事件触发顺序有两种:事件捕获与事件冒泡。
      1.冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发。
      2.捕获型事件(event capturing):事件从最不精确的对象(document 对象)开始触发,然后到最精确(也可以在窗口级别捕获事件,不过必须由开发人员特别指定)。
      Chrome浏览器支持事件捕获与事件冒泡,添加事件句柄时,默认为true,执行事件捕获,设置为false,为事件冒泡。而IE只支持事件冒泡,因此添加事件句柄的方法不同。

    兼容性写法:

    <script type="text/javascript">
    var EventUtil = {
        addHandler: function (oElement, sEvent, fnHandler) {
            oElement.addEventListener ? oElement.addEventListener(sEvent, fnHandler, false) : oElement.attachEvent("on" + sEvent, fnHandler)    
        },
        removeHandler: function (oElement, sEvent, fnHandler) {
            oElement.removeEventListener ? oElement.removeEventListener(sEvent, fnHandler, false) : oElement.detachEvent("on" + sEvent, fnHandler)
        },
        addLoadHandler: function (fnHandler) {
            this.addHandler(window, "load", fnHandler)
        }
    }
    </script>

    用法实例:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>事件练习:封装兼容性添加、删除事件的函数</title>
    <style>
    pre{color:green;padding:10px 15px;background:#f0f0f0;border:1px dotted #333;font:12px/1.5 Courier New;}
    span{color:#999;}
    </style>
    <script type="text/javascript">
    var EventUtil = {
        addHandler: function (oElement, sEvent, fnHandler) {
            oElement.addEventListener ? oElement.addEventListener(sEvent, fnHandler, false) : oElement.attachEvent("on" + sEvent, fnHandler)    
        },
        removeHandler: function (oElement, sEvent, fnHandler) {
            oElement.removeEventListener ? oElement.removeEventListener(sEvent, fnHandler, false) : oElement.detachEvent("on" + sEvent, fnHandler)
        },
        addLoadHandler: function (fnHandler) {
            this.addHandler(window, "load", fnHandler) //这里的this是对象本身
        }
    };
    EventUtil.addLoadHandler(function () {
        var aBtn = document.getElementsByTagName("input");
        
        //为第一个按钮添加绑定事件
        EventUtil.addHandler(aBtn[1], "click", function () {
            EventUtil.addHandler(aBtn[0], "click", fnHandler);    
            aBtn[0].value = "我可以点击了"
        });
        
        //解除第一个按钮的绑定事件
        EventUtil.addHandler(aBtn[2], "click", function () {
            EventUtil.removeHandler(aBtn[0], "click", fnHandler);
            aBtn[0].value = "毫无用处的按钮"    
        });
        
        //事件处理函数
        function fnHandler ()
        {
            alert("事件绑定成功!")    
        }    
    })
    </script>
    </head>
    <body>
    <pre>
    &lt;script type="text/javascript"&gt;
    var EventUtil = {
        addHandler: function (oElement, sEvent, fnHandler) {
            oElement.addEventListener ? oElement.addEventListener(sEvent, fnHandler, false) : oElement.attachEvent("on" + sEvent, fnHandler)    
        },
        removeHandler: function (oElement, sEvent, fnHandler) {
            oElement.removeEventListener ? oElement.removeEventListener(sEvent, fnHandler, false) : oElement.detachEvent("on" + sEvent, fnHandler)
        },
        addLoadHandler: function (fnHandler) {
            this.addHandler(window, "load", fnHandler)
        }
    }
    &lt;/script&gt;
    </pre>
    <center><input type="button" value="毫无用处的按钮"> <input type="button" value="绑定click"> <input type="button" value="解除绑定"></center>
    </body>
    </html>

    实例中红色区域是把整个要绑定事项包成一个匿名函数,绑定到window对象load事件上,也就是说加载完成后运行匿名函数包

    转自:https://www.jianshu.com/p/af44c7f0e4a6

  • 相关阅读:
    Postgresql 修改最大连接数到10000(默认2000多)
    Postgresql 当中有四种方式获取当前时间
    postgreSQL数据库limit分页、排序
    mybatis 中标签bool值类型为false判断
    (转)SpringCloud之服务网关Gateway
    Java线程池,isShutDown、isTerminated的作用与区别
    Java线程池的四种用法与使用场景
    (转)Java多线程:彻底搞懂线程池
    算法注意---1、取用数据之前一定要保证数据存在
    算法与数据结构---4.4、最大子段和-分治优化原理
  • 原文地址:https://www.cnblogs.com/7qin/p/9634359.html
Copyright © 2011-2022 走看看