网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网页制作 > Javascript
网页制作:Dreamweaver教程,FrontPages教程,Javascript教程,HTML教程,CSS教程,心得技巧,DHTML教程,网页特效,Discuz!论坛
本月文章推荐
.网页javascript精华代码集.
.Javascript实例教程(15) 日期函数.
.用JavaScript使链接按钮不断变化.
.将js文件编译成动态链接库(dll)文.
.提高外链JavaScript脚本 的效率以.
.用flash+javascript实现网页中复.
.javascript实现类似google和msn .
.深入理解Javascript闭包(closure) .
.用JavaScript实现变色背景和文字.
.javascript实现划词标记划词搜索.
.限制文本字节数的JS源代码程序.
.如何用javascript判断录入的日期.
.使用javascript函数完美控制页面.
.根据分辨率不同调用不同的css文件.
.使用Javascript修改客户端注册表.
.注意JavaScript中RegExp对象的te.
.javascript中的数组应用的一点发.
.JavaScript类的静态成员及其修改.
.JavaScript发送邮件.
.用JavaScript实现浏览器地震效果.

JavaScript学习笔记(5)事件处理之事件流与事件处理函数分配

发表日期:2008-11-5


如果你在页面上做一次点击例如点击一个按钮,那么你是首先点击了该按钮然后动作传入了按钮的容器,最后传入整个页面Document还是首先点击了页面Document,然后是按钮的容器,最后导致按钮的点击呢?
  JavaScript对这种问题的处理方式可以称之为事件流即事件的传播机制。对于事件流IE跟FF有不同的解释。IE下的解决方案称之为:冒泡型事件,而FF下称之为:捕获型事件。顾名思义冒泡型事件是从低而上的触发机制,而捕获型事件则是从上到下的触发机制。《JavaScript高级程序设计》一书提到:
    DOM事件流同时支持两种事件触发机制,但是捕获型事件先发生。注意因为事件的目标(也就是DOM树最深的节点)是最精确的元素,实际上它会连续接收两次事件,一次是在捕获过程中,一次是在冒泡过程中。事情到底是不是这样呢?观察下面的程序:
<html onclick=" clickHandle('html'); ">
  <head>
    <title>JAVASCRIPT事件流</title>
    <meta http-equiv="content-type" content="text/html; charset=GBK">
    <script type="text/javascript">
        function clickHandle(ele){
            alert(ele);
        }
    </script>
  </head>
  <body onclick=" clickHandle('body'); ">
    <div style="bgcolor:red" onclick=" clickHandle('div'); ">click me!</div>
  </body>
</html>
IE:点击 click me 运行顺序为:DIV-->BODY-->HTML 点击页面其他部分:BODY-->HTML
FF: 点击 click me 运行顺序为:DIV-->HTML-->BODY 点击页面其他部分:HTML-->BODY
  呵呵,好像跟书上说的不太一样哦!程序的运行结果告诉我们:不管是在IE下还是在FireFox下,事件总是由最精确的元素(也就是DOM树中最深的节点)首先触发,然后才开始IE下的冒泡和FireFox下的捕获。

  JavaScript为我们提供了三种事件处理函数的分配方式,第一种就像上面的程序一样,是在HTML代码中分配事件处理函数。
第二种方法是在JavaScript中分配事件处理函数,这种方法首先必须得获得要分配事件处理函数的元素的引用,参考以下程序:
1         window.onload = function(){
2             var oDiv = document.getElementById("contentDiv");
3             oDiv.onclick = function(){
4                 alert(oDiv.innerHTML);
5             }
6         }就像上面提到的,该方法在分配事件处理函数时必须保证已经获得对该元素的引用,所以这个程序才把oDiv的onclick事件放在了onload事件的内部,否则会报oDiv未被定义。还有一个需要注意的地方是使用这种事件处理函数的分配方式时只能为某个特定的事件分配一个函数且事件函数的签名必须小写,否则前面分配的函数会被后面的函数所覆盖,如果想为同一个事件分配两个以上的处理函数,需要采用第三种事件处理函数分配方式。
  在IE中我们使用obj.attachEvent()方法为某个元素分配函数,使用obj.detachEvent()方法为某个元素分离事件处理函数,而在DOM(以FireFox为例)中我们使用addEventListener()方法分配函数,使用removeEventListener()方法分离函数。
  参考一下代码:
 1         window.onload = function(){
 2             var oDiv = document.getElementById("contentDiv");
 3             var func1 =  function(){
 4                 alert(oDiv.innerHTML);
 5             }
 6             var func2 = function(){
 7                 alert("also " + oDiv.innerHTML);
 8             }
 9             //IE
10             if(oDiv.attachEvent){
11                 oDiv.attachEvent("onclick",func1);
12                 oDiv.attachEvent("onclick",func2);
13                 //oDiv.detachEvent("onclick",func1);
14             } else if(oDiv.addEventListener){
15                 //FireFox
16                 oDiv.addEventListener("click",func1,true);
17                 oDiv.addEventListener("click",func2,true);
18                 //oDiv.removeEventListener("click",func1,true);
19             }
20            
21         }我们来说明一下IE下与FireFox下这种事件处理函数的不同点:
1、在函数的第一个参数中,IE下必须有"on"做为前缀,而FF下不用,两种情况下处理函数签名必须小写。
2、FireFox下的addEventListener()函数的第三个参数表示的是:true表示在捕获阶段增加事件处理函数,false表示在冒泡阶段增加事件处理函数,但是由于FireFox不支持冒泡事件流,所以这里我们设成True或者Flase好像没什么区别。但是要注意的一点就是,如果在 addEventListener()中第三个参数设为true,那么在removeEventListener()方法中的第三个参数一定也要设为相同的值,否则方法失效。
3、在运行时阶段,IE首先执行的是最后边一个被增加的事件处理函数然后才是倒数第二个以此类推,但是在FireFox下与IE相反,他会按照事件处理函数的添加顺序执行。

上一篇:JavaScript学习笔记(4)表格排序 人气:475
下一篇:JavaScript学习笔记(6) 通过延迟触发使onDbClick时不触发onClick事件 人气:446
浏览全部JavaScript学习笔记的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐