龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > Javascript编程 >

关于编写性能高效的javascript事件的技术(2)

时间:2014-12-03 02:00来源:网络整理 作者:网络 点击:
分享到:
DOM0级事件处理的事件属性都是采用“on+事件名称”的方式定义,整个属性都是小写字母。我们知道DOM元素在javascript代码里就是一个javascript对象,因此从

DOM0级事件处理的事件属性都是采用“on+事件名称”的方式定义,整个属性都是小写字母。我们知道DOM元素在javascript代码里就是一个javascript对象,因此从javascript对象角度理解DOM0级事件处理就非常容易,例如下面代码:

复制代码 代码如下:

btnDOM.onclick = null;  

  那么按钮的点击事件被取消了。

  再看下面的代码:

复制代码 代码如下:

btnDOM.onclick = function(){
         alert("click me!");           
}
 
btnDOM.onclick = function(){
         alert("click me1111!");           
}

后面一个函数会将第一个函数覆盖。

  方式三:DOM2事件处理和IE事件处理

  DOM2事件处理是标准化的事件处理方案,但是IE浏览器自己搞了一套,功能和DOM2事件处理相似,但是代码写起来就不太一样了。

  在讲解方式三之前,我必须要补充一些概念,否则是无法讲清楚方式三的内涵。

  第一个概念是:事件流

在页面开发里我们常常会碰到这样的情况,一个页面的工作区间在javascript可以用document表示,页面里有个div,div等于是覆盖在document元素上,div里面有个button元素,button元素是覆盖在div上,也等于覆盖着document上,所以问题来了,当我们点击这个按钮时候,这个点击行为其实不仅仅发生在button之上,div和document都被作用了点击操作,按逻辑这三个元素都是可以促发点击事件的,而事件流正是描述上述场景的概念,事件流的意思是:从页面接收事件的顺序。

第二个概念:事件冒泡和事件捕获

事件冒泡是微软公司提出解决事件流问题的方案,而事件捕获则是网景公司提出的事件流解决方案,它们的原理如下图:

冒泡事件由div开始,其次是body,最后是document,事件捕获则是倒过来的先是document,其次是body,最后是目标元素div,相比之下,微软公司的方案更加人性化符合人们的操作习惯,网景的方案就很别扭了,这是浏览器大战的恶果,网景慢了一步就以牺牲用户习惯的代码解决事件流的问题。

       微软公司结合冒泡事件设计了一套新的事件系统,业界习惯称为ie事件处理,ie事件处理方式如下面代码所示:

复制代码 代码如下:

var btnDOM = document.getElementById("btn");
btnDOM.attachEvent("onclick",function(){
         alert("Click Me!");
});

在ie下通过DOM元素的attachEvent方法添加事件,和DOM0事件处理相比,添加事件的方式由属性变成了方法,所以我们添加事件就需要往方法里传递参数,attachEvent方法接收两个参数,第一个参数是事件类型,事件类型的命名和DOM0事件处理里的事件命名一样,第二个参数是事件函数了,使用方法的好处就是如果我们在为同一个元素添加个点击事件,如下所示:

复制代码 代码如下:

btnDOM.attachEvent("onclick",function(){
         alert("Click Me!");
});
btnDOM.attachEvent("onclick",function(){
         alert("Click Me,too!");
});

运行之,两个对话框都能正常弹出来,方法让我们可以为DOM元素添加多个不同的点击事件。如果我们不要某个事件呢?我们该怎么做了,ie为删除事件提供了detachEvent方法,参数列表和attachEvent一样,如果我们要删除某个点击事件,只要传递和添加事件一样的参数即可,如下代码所示:

复制代码 代码如下:

btnDOM.detachEvent("onclick",function(){
         alert("Click Me,too!");
});

精彩图集

赞助商链接