zoukankan      html  css  js  c++  java
  • 深入了解javascript事件 事件绑定(事件处理函数/监听函数)

         首先不推荐使用的写法,类似上一节的例子<div onclick="doclick(this);"> click me!</div>这种写法虽然在各种浏览器都可以执行,但是比较影响代

    码的结构使html代码跟脚本代码糅在一起,不变代码的阅读和修改。

         现在来介绍下3种事件绑定和它们之间的优缺点。

         1、传统型事件绑定,如下代码

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
    </head>
    <body>
    <div id='sampleDiv'> click me!</div>
    <br />
    <div id='Div1'> click me2!</div>
    </body>
        <script type="text/javascript">
            document.getElementById("sampleDiv").onclick = function (e) {
                alert(this.nodeName);
            }
            document.getElementById("sampleDiv").onclick = function (e) {
                alert(this.innerHTML);
            }
            document.getElementById("Div1").onclick = function (e) {
                tt();
            }
            function tt() {
                alert(this.innerHTML);
            }
        </script>

    </html> 

    点击ID为sampleDiv 的DIV元素,页面弹出 click me!。 

    这种绑定方式的优点就是 :

    1、使得html代码和脚本剥离

    2、在各种浏览器上都能稳定的运行

    3、this对象指向元素本身(特别注意的是ID为div1的onclick写法,很多新手都犯了这种错误,这种写法的this就不是指向元素本身,而是window对象,因为tt函数属于window的!)

        缺点也非常多:

    1、事件一次只能绑定一个函数,例如上面的代码,后绑定的函数覆盖了前绑定的元素。

    2、事件对象参数在IE中不能用(IE9可以, IE8 ,IE7 IE6均不可以) 上面绑定的函数的e在IE9以下版本会是undefined.ie中获取事件的对象的唯一方法就是window.event。

         2、W3C DOM 事件绑定(除了IE其他主流浏览器均支持),如下代码所示

     <html xmlns="http://www.w3.org/1999/xhtml">

    <head>
        <title></title>
    </head>
    <body>
    <div id='sampleDiv'> click me!</div>
    <br />
    </body>
        <script type="text/javascript">
            document.getElementById("sampleDiv").addEventListener("click", function (e) {
                alert(e);
                alert(this.nodeName);
            }, false);

            document.getElementById("sampleDiv").addEventListener("click", function () {
                alert(arguments[0]);
            }, false);
     
        </script>
    </html>

     首先说明下addEventListener函数,有3个参数,第一个是事件名称,第二个是处理函数,第三个是是否启用捕获型事件标识(一般不启用)。

    点击click me!依次弹出 [object MouseEvent],DIV, [object MouseEvent] 。

    现在很容易看出W3C Dom事件绑定的优点:

    1、可以绑定多个处理函数互不覆盖。

    2、this元素指向元素本身。

    3、事件对象是绑定函数的第一个参数。

    4、可以同时支持冒泡型和捕获型事件。

    唯一的缺点就是在IE下不支持。 

       2、IE DOM 事件绑定(IE特有),如下代码所示

     <html xmlns="http://www.w3.org/1999/xhtml">

    <head>
        <title></title>
    </head>
    <body>
    <div id='sampleDiv'> click me!</div>
    <br />
    </body>
        <script type="text/javascript">
            document.getElementById("sampleDiv").attachEvent("onclick", function () {
                //alert(e.type);
                alert(arguments[0].type);
                alert(window.event.type);
                alert(this.nodeName);
            });
            document.getElementById("sampleDiv").attachEvent("onclick", function (e) {
                alert(e.type);
              
            });
         
        </script>
    </html>

    点击 click me!弹出click,click,click,undefined.

    现在很容易看出IE Dom事件绑定的优点: 

    1、可以同时绑定多个处理函数。

    2、 获取事件对象可以从事件对象参数中获取 如果没有事件对象参数 可以从window.event或者arguments[0]获取。

    缺点:

    1、仅适用于IE

    2、this关键字不是指向元素本身。

    3、网上有很多文章说 attachEvent存在内存泄露的风险(我没有实际测试过),可以在页面的卸载onunload 事件中把事件反注册就可 element.detachEvent('onclick', doClick)。

    好了今天就到这里。 

  • 相关阅读:
    退出窗口时出现“当”的响声
    屏幕设备环境
    修改一个完全颜色的CListCtrl类
    修改一个完全颜色的CListCtrl类
    MFC中CString.Format的详细用法
    网上阅卷系统自动识别功能代码
    mfc 子对话框数据传给父对话框
    already defined in *.obj
    Object 的使用
    this 函数执行上下文
  • 原文地址:https://www.cnblogs.com/xuzhiwei/p/2510790.html
Copyright © 2011-2022 走看看