zoukankan      html  css  js  c++  java
  • 深入了解javascript事件 自定义事件绑定

    上一节分析了3种的事件绑定的优缺点,今天我们来写一个通用的能适合各种浏览器的事件绑定函数。

    这里我们不重新写了,综合网上各种比较好的通用事件绑定函数,我这里采用大师 Dean Edwards事件绑定代码,请大家详细看下面的注释

       

     function addEvent(element, type, handler) {
                //给函数分配唯一的标志ID
                if (!handler.$$guid) handler.$$guid = addEvent.guid++;
                //创建一个hash table来保存各种事件的处理函数  
                if (!element.events) element.events = {};
                //创建一个hash table来保存某个事件处理函数
                var handlers = element.events[type];
                if (!handlers) {
                    handlers = element.events[type] = {};
                    //储存已经存在的事件处理函数
                    if (element["on" + type]) {
                        handlers[0] = element["on" + type];
                    }
                }
                // 保存时间处理函数到hash table中
                handlers[handler.$$guid] = handler;
                // 为事件提供一个统一全局的处理函数 这句是关键handleEvent函数属于element,也就是说函数的内部this是指向element
                element["on" + type] = handleEvent;
            };
            addEvent.guid = 1;
            function removeEvent(element, type, handler) {
                // 移除 
                if (element.events && element.events[type]) {
                    delete element.events[type][handler.$$guid];
                } 
            };
            function handleEvent(event) {
               //获取事件对象
                event = event || window.event;
                // 注意这里的this指向dom元素 因为addEvent中element["on" + type] = handleEvent
                 //获取已经缓存到dom元素的events属性的各个事件函数
                var handlers = this.events[event.type];
                //遍历各个函数
                for (var i in handlers) {
                    // 注意这里的this指向dom元素 所有实际的处理函数变成element的一个内部处理函数 
                    // 所以函数内部this指向dom元素
                    this.$$handleEvent = handlers[i];
                    //触发函数
                    this.$$handleEvent(event);
                } 
            };  

    使用方法代码如下:

       
     <script type="text/javascript">

            window.onload = function () {
                var tt = document.getElementById("sfs");
           
                addEvent(tt, "click", t1);
                addEvent(tt, "click", t2);
            }
            function t1() {
                var i = this;
            }
            function t2() {
                var i = this;
            }

            function addEvent(element, type, handler) {
                //给函数分配唯一的标志ID
                if (!handler.$$guid) handler.$$guid = addEvent.guid++;
                //创建一个hash table来保存各种事件的处理函数  
                if (!element.events) element.events = {};
                //创建一个hash table来保存某个事件处理函数
                var handlers = element.events[type];
                if (!handlers) {
                    handlers = element.events[type] = {};
                    //储存已经存在的事件处理函数
                    if (element["on" + type]) {
                        handlers[0] = element["on" + type];
                    }
                }
                // 保存时间处理函数到hash table中
                handlers[handler.$$guid] = handler;
                // 为事件提供一个统一全局的处理函数 这句是关键handleEvent函数属于element,也就是说函数的内部this是指向element
                element["on" + type] = handleEvent;
            };
            addEvent.guid = 1;
            function removeEvent(element, type, handler) {
                // 移除 
                if (element.events && element.events[type]) {
                    delete element.events[type][handler.$$guid];
                } 
            };
            function handleEvent(event) {
               //获取事件对象
                event = event || window.event;
                // 注意这里的this指向dom元素 因为addEvent中element["on" + type] = handleEvent
                 //获取已经缓存到dom元素的events属性的各个事件函数
                var handlers = this.events[event.type];
                //遍历各个函数
                for (var i in handlers) {
                    // 注意这里的this指向dom元素 所有实际的处理函数变成element的一个内部处理函数 
                    // 所以函数内部this指向dom元素
                    this.$$handleEvent = handlers[i];
                    //触发函数
                    this.$$handleEvent(event);
                } 
            };  
        </script>
    </head>
    <body>
      <div  style=" height:800px; 800px; background:red; border:20px solid black; padding:50px;">
      <div  id="sfs" style="height:200px; 200px; background:green; position:relative; ">safsasafss</div>

      </div> 

  • 相关阅读:
    UITextView 和 UITextField 的提示信息placeholder
    【转载】ios下的正则表达式,RegexKitLite
    Java集合(2)一 ArrayList 与 LinkList
    Java并发(2) 聊聊happensbefore
    Java并发(3) 聊聊Volatile
    Java并发(1) 聊聊Java内存模型
    Java集合(5)一 HashMap与HashSet
    Java集合(3)一 红黑树、TreeMap与TreeSet(上)
    Java集合(4)一 红黑树、TreeMap与TreeSet(下)
    Java集合(1)一 集合框架
  • 原文地址:https://www.cnblogs.com/xuzhiwei/p/2512287.html
Copyright © 2011-2022 走看看