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> 

  • 相关阅读:
    Two strings CodeForces
    Dasha and Photos CodeForces
    Largest Beautiful Number CodeForces
    Timetable CodeForces
    Financiers Game CodeForces
    AC日记——整理药名 openjudge 1.7 15
    AC日记——大小写字母互换 openjudge 1.7 14
    AC日记——将字符串中的小写字母换成大写字母 openjudge 1.7 13
    AC日记——加密的病历单 openjudge 1.7 12
    AC日记——潜伏着 openjudge 1.7 11
  • 原文地址:https://www.cnblogs.com/xuzhiwei/p/2512287.html
Copyright © 2011-2022 走看看