深入了解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)。

好了今天就到这里。 

 

 

posted @ 2012-07-15 18:42  许志伟  阅读(423)  评论(0编辑  收藏  举报