zoukankan      html  css  js  c++  java
  • 添加事件的兼容性写法

    通常,我们为某个控件元素添加事件时,用的是:

    1 ele.onclick=fn1(){};
    2 或者
    3 ele.onclick=fn1;  //此时不需要加括号,调用的是整个方法而不是return的结果
    4 function fun1(){}

    这种绑定事件的方法简单高效,但对同一个控件的同一个动作进行绑定时,前面的事件容易被重叠。故需要对控件的事件进行监听。

    监听的方法有两种,分别为addEventListener和attachEvent。

    • 首先addEventListener进行了解

              ele.addEventListener(type,listener,useCapture);共三个参数

    参数  参数说明
    ele  需要绑定的控件或是html结点
    type  触发事件名称。注意:需要去掉‘on’,为‘click’或者‘mouseover’等
    listener  事件的监听函数,即要执行的方法。注意:在此,函数名不需要加()。因为不调用的是整个函数,而不是返回的结果。
    useCapture

    事件监听方式,只能是true和false。

    true,采用capture(捕获模式:从外向内);

    false,采用bubbling(冒泡模式:从内向外)。

    如无特殊要求,一般是false。

     

     

     

     

     

     

     

    是W3C所支持的事件绑定方法,Chrome、FireFox、Opera、Safari、IE9.0及其以上版本都支持该函数

    1 //ele.addEventListener(type,listener,useCapture);
    2 btn1.addEventListener("click",fn1,false);
    3 btn1.addEventListener("click",fn2,false);
    4 btn1.addEventListener("click",fn3,false);

      执行的顺序是fn1-fn2-fn3

    • attechEvent的了解

      ele.attechEvent(type,function);

    参数  参数说明
    type 触发事件名称。注意:不能去掉‘on’,为‘onclick’或者‘onmouseover’等
    function 事件的监听函数,即要执行的方法。同样的不带()。

        IE8.0及其以下版本(互补版本)

    1 //ele.attachEvent(type,function);
    2 btn1.attachEvent("onclick",fn1);
    3 btn1.attachEvent("onclick",fn2);
    4 btn1.attachEvent("onclick",fn3);

      执行顺序fn3-fn2-fn1

    • 所以,采取这种事件的绑定及解绑的方法必须要采取兼容性的写法:
    1. 封装:(利用对象.属性方法调用)
     1 <!DOCTYPE html>
     2 <html>
     3 <head lang="en">
     4     <meta charset="UTF-8">
     5     <title></title>
     6 </head>
     7 <body>
     8     <button>赋诗</button>
     9 
    10 
    11 <script>
    12 
    13     var btn = document.getElementsByTagName("button")[0];
    14 
    15     EventListen = { 
    16         addEvent: function (ele,fn,str) {
    17             //通过判断调用的方式兼容IE678
    18             //判断浏览器是否支持该方法,如果支持那么调用,如果不支持换其他方法
    19             if(ele.addEventListener){
    20                 //直接调用
    21                 //火狐谷歌IE9+支持addEventListener
    22                 ele.addEventListener(str,fn);
    23             }else if(ele.attachEvent){
    24                 //IE678支持attachEvent
    25                 ele.attachEvent("on"+str,fn);
    26             }else{
    27                 //在addEventListener和attachEvent都不存在的情况下,用此代码
    28                 ele["on"+str] = fn;
    29             }
    30         },
    31         removeEvent: function (ele,fn,str) {
    32             if(ele.removeEventListener){
    33                 ele.removeEventListener(str,fn);
    34             }else if(ele.detachEvent){
    35                 ele.detachEvent("on"+str,fn);
    36             }else{
    37                 ele["on"+str] = null;
    38             }
    39         }
    40     };
    41 
    42 //    btn.addEventListener("click",fn);
    43     EventListen.addEvent(btn,fn,"click");
    44 
    45     EventListen.removeEvent(btn,fn,"click");
    46 
    47     function fn(){  //定义fn函数
    48         alert(1);
    49     }
    50 
    51 </script>
    52 </body>
    53 </html>

        

    以下内容为转载内容

    • 转载版第一个
     1 function addEvent(ele, type, fn, useCapture) {
     2     if (ele.addEventListener) {
     3         ele.addEventListener(type, fn, useCapture);//DOM2.0
     4         return true;
     5     }
     6     else if (ele.attachEvent) {
     7         var r = ele.attachEvent(‘on‘ + type, fn);//IE5+
     8         return r;
     9     }
    10     else {
    11         ele['on' + type] = fn;//DOM 0
    12     }
    13 }        
    • 下面是Dean Edwards 的版本
     1 function addEvent(element, type, handler) {
     2     //为每一个事件处理函数分派一个唯一的ID
     3     if (!handler.$$guid) 
     4         handler.$$guid = addEvent.guid++;
     5 
     6     //为元素的事件类型创建一个哈希表
     7     if (!element.events) 
     8         element.events = {};
     9 
    10     //为每一个"元素/事件"对创建一个事件处理程序的哈希表
    11     var handlers = element.events[type];
    12     if (!handlers) {
    13         handlers = element.events[type] = {};
    14         //存储存在的事件处理函数(如果有)
    15         if (element["on" + type]) {
    16             handlers[0] = element["on" + type];
    17         }
    18     }
    19 
    20     //将事件处理函数存入哈希表
    21     handlers[handler.$$guid] = handler;
    22 
    23     //指派一个全局的事件处理函数来做所有的工作
    24     element["on" + type] = handleEvent;
    25 };
    26 
    27 //用来创建唯一的ID的计数器
    28 addEvent.guid = 1;
    29 function removeEvent(element, type, handler) {
    30     //从哈希表中删除事件处理函数
    31     if (element.events && element.events[type]) {
    32         delete element.events[type][handler.$$guid];
    33     }
    34 };
    35 function handleEvent(event) {
    36     var returnValue = true;
    37     //抓获事件对象(IE使用全局事件对象)
    38     event = event || fixEvent(window.event);
    39     //取得事件处理函数的哈希表的引用
    40     var handlers = this.events[event.type];
    41     //执行每一个处理函数
    42     for (var i in handlers) {
    43         this.$$handleEvent = handlers[i];
    44         if (this.$$handleEvent(event) === false) {
    45             returnValue = false;
    46         }
    47     }
    48     return returnValue;
    49 };
    50 
    51 //为IE的事件对象添加一些“缺失的”函数
    52 function fixEvent(event) {
    53     //添加标准的W3C方法
    54     event.preventDefault = fixEvent.preventDefault;
    55     event.stopPropagation = fixEvent.stopPropagation;
    56     return event;
    57 };
    58 fixEvent.preventDefault = function() {
    59     this.returnValue = false;
    60 };
    61 fixEvent.stopPropagation = function() {
    62     this.cancelBubble = true;
    63 };          

      功能非常强悍,解决IE的this指向问题,event总是作为第一个参数传入,跨浏览器就更不在话下。

      3.最后一个HTML5的版本:

     1     var addEvent=(function(){
     2         if(document.addEventListener){
     3             return function(el,type,fn){
     4                 if(el.length){
     5                     for(var i=0;i&lt;el.length;i++){
     6                         addEvent(el[i],type,fn);
     7                     }
     8                 }else{
     9                     el.addEventListener(type,fn,false);
    10                 }
    11             };
    12         }else{
    13             return function(el,type,fn){
    14                 if(el.length){
    15                     for(var i=0;i&lt;el.length;i++){
    16                         addEvent(el[i],type,fn);
    17                     }
    18                 }else{
    19                     el.attachEvent(‘on‘+type,function(){return fn.call(el,window.event);});
    20                 }
    21             };
    22         }
    23     })();
  • 相关阅读:
    Silverlight与WPF开发人员入门应该知道的十件事
    Silverlight4.0教程之使用鼠标右键事件和滚轮事件
    Silverlight实用窍门系列:4.Silverlight 4.0添加鼠标右键菜单和Silverlight全屏模式的进入退出。【附带源码实例】
    将moss 2007的模板文件导入到moss 2010
    Silverlight4.0教程之打印报表和图形
    .NET MessageBox 网页弹出消息框
    使用sharepoint自带的文本编辑器1
    C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):目录
    推荐一个非常好的在线免费的 Photoshop
    Silverlight游戏设计(Game Design):目录
  • 原文地址:https://www.cnblogs.com/zp0818/p/9236605.html
Copyright © 2011-2022 走看看