zoukankan      html  css  js  c++  java
  • JS事件处理程序

    事件:用户或者浏览器自身执行的某种动作,例如click,load,mouseover等。

    事件处理程序:响应某个事件的函数。事件处理程序的名字以"on"开头。因此click事件的事件处理程序就是onclick,load事件的事件处理程序就是onload。

    为事件指定事件处理程序的方式有好几种:

    1. HTML事件处理程序

      一般不用。

    2. DOMLevel0级事件处理程序(所有浏览器均支持

      首先必须取得要操作的对象的引用:

    var btn = document.getElementById("myBtn");
    btn.onclick = function(){
      alert("clicked");      
    };

    DOMLevel0事件处理程序被认为是元素的方法。因此,这时候的事件处理程序是在所操作的元素的作用域内运行,所以this引用当前元素:

    var btn = document.getElementBy("myBtn");
    btn.onclick = function(){
       alert(this.getAttribute("id")); 
      alert(this.id); };

    上面的例子获取了元素的id,当然还可以通过this访问元素的任何属性和方法,访问元素属性可以通过下面两种方法:

    • this.propertyName
    • this.getAttribute(propertyName)

    访问元素的方法目前我只知道通过this.methodName来访问。

    那么如何删除DOMLevel0事件处理程序呢?

    btn.onclick = null; //删除事件处理程序

    将事件处理程序设置为null后,再单击按钮将不会有任何动作发生。

    DOMLevel0事件处理程序会在事件流的冒泡阶段被处理。

    3. DOMLevel2事件处理程序(>=IE9, FireFox, Safari, Chrome, Opera

      DOMLevel2事件处理程序定义了两个方法:

    • addEventListener(eventName, functionName, true/false)
    • removeEventListener(eventName, functionName, true/false)

    分别用来添加事件处理程序和删除事件处理程序。三个参数分别是:事件名,事件处理函数,捕获(true)还是冒泡(false)阶段处理该事件。

    下面这里例子说明了设置为捕获跟冒泡的区别:

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
        <style type="text/css">
            div {
                width: 100px;
                height: 50px;
                background-color: gray;
            }
        </style>
    </head>
    <body>
        <div id="div1">
            <div id="div2">
                <div id="div3"></div>
            </div>
        </div>
    
        <script type="text/javascript">
            var div1 = document.getElementById("div1");
            var div2 = document.getElementById("div2");
            var div3 = document.getElementById("div3");
    
            div1.addEventListener("click", function(){
                alert("div1");
            }, false);
    
            div2.addEventListener("click", function(){
                alert("div2");
            }, false);
    
            div3.addEventListener("click", function(){
                alert("div3");
            }, false);
    
        </script>
    </body>
    </html>

    通过addEventListener()添加的事件处理程序只能通过removeEventListener()来移除,移除时传入的参数与添加事件处理程序时使用的参数必须相同,通过addEventListener()添加的匿名函数将无法移除,如果想随后移除某个事件处理程序,则添加事件处理程序的时候要注意使用有名函数:

    var btn = document.getElementById("myBtn");
    var handler = function(){
       alert(this.id); 
    };
    btn.addEventListener("click", handler, false);
    
    //这里省略了其他代码
    
    btn.removeEventListener("click", handler, false);

    3. IE事件处理程序(<=IE8)

      IE实现了与DOMLevel2类似的两个方法:

    • attachEvent(eventHandlerName, functionName)
    • detachEvent(eventHandlerName, functionName)

    四点与DOMLevel2不同的地方需要注意:

    • 添加到冒泡阶段
    • 第一个参数是eventHandlerName("onclick"),而不是eventName("click")
    • 事件处理程序在全局作用域内运行,所以this指向window(编写跨浏览器代码时需要注意)
    • 多次添加同一个事件处理程序时,后添加的先执行

    4. 使事件处理程序能够跨浏览器

       DOMLevel0和IE事件处理程序都会添加到冒泡阶段,因此要保证处理事件的代码能够在大多数浏览器下一致的运行,只需关注冒泡阶段。下面创建EventUtil对象来处理浏览器之间的差异。EventUtil对象包含两个方法:

    • addHandler(element, eventName, functionName)
    • removeHandler(element, eventName, functionName)
    var EventUtil = {
        addHandler: function(element, eventName, handler){
            if(element.addEventListener){
                element.addEventListener(eventName, handler, false);//添加到冒泡阶段
            }
            else if(element.attachEvent){
                element.attachEvent("on" + eventName, handler);
            }
            else {
                element["on" + eventName] = handler;
            }
        },
        removeHandler: function(element, eventName, handler){
            if(element.removeEventListener){
                element.removeEventListener(eventName, handler, false);
            }
            else if(element.detachEvent){
                element.detachEvent("on" + eventName, handler);
            }
            else {
                element["on" + eventName] = null;
            }
        }
    };

    调用该API的方式如下:

    function handler(){
        alert("clicked");
    }
    EventUtil.addHandler(div1, "click", handler);
    EventUtil.removeHandler(div1, "click", handler);

    注意:为了避免IE中事件处理程序的作用域问题,上面handler函数中不能出现this引用。

      

  • 相关阅读:
    CoreThink开发(十三)增加页面加载动画
    CoreThink开发(十二)更改默认出错异常页防止暴露敏感数据
    CoreThink开发(十一)首页控制器判断移动设备还是PC并做相应处理
    CoreThink开发(十)把官方首页轮播替换成HTML5-3D轮播
    CoreThink主题开发(九)使用H-ui开发博客主题之用户个人主页
    CoreThink主题开发(八)使用H-ui开发博客主题之用户登录之前及登录之后
    CoreThink主题开发(七)使用H-ui开发博客主题之新闻资讯正文页面
    centos7搭建postfix邮件服务器
    Kibana插件sentinl实现邮件报警
    kibana-Request Timeout after 30000ms故障解决
  • 原文地址:https://www.cnblogs.com/iamswf/p/4741889.html
Copyright © 2011-2022 走看看