linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘网络学院网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > 开发语言 > JavaScript >
栏目导栏
  php
  JSP
  ASP
  asp.net
  JAVA
  c/c++/c#
  perl
  JavaScript
  Basic
  Delphi
资料搜索
热门文章
·javascript 时间对象的格式化
·去掉字符串前后的空格
·javascript 事件监听机制
·javascript 事件调用顺序
·js刷新框架子页面的七种方法
·JavaScript:替换字符串
·IE下的JScript编程需注意的内存
·用javascript操作word文档
·Javascript中CTRL+回车提交表单
·JS 获取鼠标位置
·javascript判断Email地址是否有
·Javascript中Select的OnChange
·JS实现的滑动展开与折叠效果
·有分页功能的WEB打印
·Javascript实现窗口最大化的严
最新文章
·使用CSS改变表格边框样式
·为网页添加浮动广告
·判断表单中添加是否数字的JS与
·让浏览器状态栏动起来
·使用Javascript制作行间颜色间
·禁止用右键查看源代码
·网页侦测四法
·制作弹出公告窗口
·为网页添加特效
·网页中取消鼠标右键方法大全
·JavaScript 根据屏幕解析度显示
·如何实现浏览器上的右键菜单
·如何制作浮动广告
·让弹出窗口变得“体贴”一些
·JavaScript技巧:让网页自动穿上
Google
 
javascript 事件调用顺序
[ 作者:  加入时间:2007-10-15 14:30:26  来自:Linux联盟收集整理 ]

在 javascript 中两种方式注册的监听器以及先后注册的监听器调用的顺序在各个浏览器都有所不同,在这里总结一下 IE、firefox 以及 Opera 三种浏览器的调用方式: auRLinux联盟
auRLinux联盟
IE: auRLinux联盟
通过属性注册的事件最先执行。 auRLinux联盟
attachEvent 方式注册的事件后注册的先执行。 auRLinux联盟
auRLinux联盟
FireFox: auRLinux联盟
不管何种方式,都是先注册的先执行。 auRLinux联盟
但是 body 很奇怪,Html 标记里用属性注册的事件总是在最后执行(<body onmousedown="func()"),而且是在所有事件的最后(居然在 document 的后面!)。但是 js 语句注册的属性事件按上述规则执行(document.body.onmousedown=func)。 auRLinux联盟
auRLinux联盟
Opera: auRLinux联盟
不管何种方式,都是先注册的先执行。 auRLinux联盟
auRLinux联盟
测试下面代码

<html> auRLinux联盟
<script> auRLinux联盟
function bodyLegacyEvent(){ auRLinux联盟
document.getElementById("info").innerHTML+="<br/>body legacy event onmousedown"; auRLinux联盟
} auRLinux联盟
function div1LegacyEvent(){ auRLinux联盟
document.getElementById("info").innerHTML+="<br/>div1 legacy event onmousedown"; auRLinux联盟
} auRLinux联盟
function documentLegacyEvent(){ auRLinux联盟
document.getElementById("info").innerHTML+="<br/>document legacy event onmousedown"; auRLinux联盟
} auRLinux联盟
auRLinux联盟
function div0LegacyEvent(){ auRLinux联盟
document.getElementById("info").innerHTML+="<br/>div0 legacy event onmousedown"; auRLinux联盟
} auRLinux联盟
function mouseDown1(){ auRLinux联盟
document.getElementById("info").innerHTML+="<br/>body mouseDown 1"; auRLinux联盟
} auRLinux联盟
function mouseDown2(){ auRLinux联盟
document.getElementById("info").innerHTML+="<br/>body mouseDown 2"; auRLinux联盟
} auRLinux联盟
function documentMouseDown(){ auRLinux联盟
document.getElementById("info").innerHTML+="<br/>documentMouseDown"; auRLinux联盟
} auRLinux联盟
function div1MouseDown(){ auRLinux联盟
document.getElementById("info").innerHTML+="<br/>div1 mouseDown"; auRLinux联盟
} auRLinux联盟
function init(){ auRLinux联盟
if(document.all){ auRLinux联盟
document.body.attachEvent("onmousedown",mouseDown1); auRLinux联盟
document.body.attachEvent("onmousedown",mouseDown2); auRLinux联盟
document.attachEvent("onmousedown",documentMouseDown); auRLinux联盟
document.getElementById("d1").attachEvent("onmousedown",div1MouseDown); auRLinux联盟
}else{ auRLinux联盟
document.body.addEventListener("mousedown",mouseDown1,false); auRLinux联盟
document.body.addEventListener("mousedown",mouseDown2,false); auRLinux联盟
document.addEventListener("mousedown",documentMouseDown,false); auRLinux联盟
document.getElementById("d1").addEventListener("mousedown",div1MouseDown,false); auRLinux联盟
} auRLinux联盟
auRLinux联盟
document.onmousedown=documentLegacyEvent; auRLinux联盟
} auRLinux联盟
</script> auRLinux联盟
<body onload="init()" onmousedown="bodyLegacyEvent()"> auRLinux联盟
<div id="d0" onmousedown="div0LegacyEvent()"> auRLinux联盟
<div id="d1" onmousedown="div1LegacyEvent()">click here<br/>click here</div> auRLinux联盟
</div> auRLinux联盟
<div id="info"></div> auRLinux联盟
</body> auRLinux联盟
</html>

改用 js 动态注册 body 的属性事件,并且在最前面注册属性事件:

<html> auRLinux联盟
<script> auRLinux联盟
function bodyLegacyEvent(){ auRLinux联盟
document.getElementById("info").innerHTML+="<br/>body legacy event onmousedown"; auRLinux联盟
} auRLinux联盟
function div1LegacyEvent(){ auRLinux联盟
document.getElementById("info").innerHTML+="<br/>div1 legacy event onmousedown"; auRLinux联盟
} auRLinux联盟
function documentLegacyEvent(){ auRLinux联盟
document.getElementById("info").innerHTML+="<br/>document legacy event onmousedown"; auRLinux联盟
} auRLinux联盟
auRLinux联盟
function div0LegacyEvent(){ auRLinux联盟
document.getElementById("info").innerHTML+="<br/>div0 legacy event onmousedown"; auRLinux联盟
} auRLinux联盟
function mouseDown1(){ auRLinux联盟
document.getElementById("info").innerHTML+="<br/>body mouseDown 1"; auRLinux联盟
} auRLinux联盟
function mouseDown2(){ auRLinux联盟
document.getElementById("info").innerHTML+="<br/>body mouseDown 2"; auRLinux联盟
} auRLinux联盟
function documentMouseDown(){ auRLinux联盟
document.getElementById("info").innerHTML+="<br/>documentMouseDown"; auRLinux联盟
} auRLinux联盟
function div1MouseDown(){ auRLinux联盟
document.getElementById("info").innerHTML+="<br/>div1 mouseDown"; auRLinux联盟
} auRLinux联盟
function init(){ auRLinux联盟
document.onmousedown=documentLegacyEvent; auRLinux联盟
document.body.onmousedown=bodyLegacyEvent; auRLinux联盟
if(document.all){ auRLinux联盟
document.body.attachEvent("onmousedown",mouseDown1); auRLinux联盟
document.body.attachEvent("onmousedown",mouseDown2); auRLinux联盟
document.attachEvent("onmousedown",documentMouseDown); auRLinux联盟
document.getElementById("d1").attachEvent("onmousedown",div1MouseDown); auRLinux联盟
}else{ auRLinux联盟
document.body.addEventListener("mousedown",mouseDown1,false); auRLinux联盟
document.body.addEventListener("mousedown",mouseDown2,false); auRLinux联盟
document.addEventListener("mousedown",documentMouseDown,false); auRLinux联盟
document.getElementById("d1").addEventListener("mousedown",div1MouseDown,false); auRLinux联盟
} auRLinux联盟
auRLinux联盟
} auRLinux联盟
</script> auRLinux联盟
<body onload="init()"> auRLinux联盟
<div id="d0" onmousedown="div0LegacyEvent()"> auRLinux联盟
<div id="d1" onmousedown="div1LegacyEvent()">click here<br/>click here</div> auRLinux联盟
</div> auRLinux联盟
<div id="info"></div> auRLinux联盟
</body> auRLinux联盟
</html>

比较三个浏览器里面的事件执行顺序,Firefox 和 Opera 比较相似,FireFox 仅在 body 元素上有点不符合常理,实际上我感觉要么是我还找不到规律,要么 FireFox 在处理 body 标记的属性事件上存在 bug。IE 的处理个人认为采用 stack 方式不怎么合理,后注册的事件会在最先运行,无法把握程序运行次序。 auRLinux联盟
auRLinux联盟
总结:避免和事件执行循序相关的代码,尽量让事件执行的顺序和程序流程无关。

Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·通过JAVAScript实现页面自适应  (2007-10-30 14:27:43)
 ·如何优化JavaScript脚本的性能  (2007-10-30 14:25:25)
 ·几个有用的Javascript验证脚本  (2007-10-30 14:24:47)
 ·Javascript+ASP打造无刷新新闻列表  (2007-10-30 14:23:38)
 ·如何用javascript防止双击  (2007-10-30 14:19:44)
 ·JavaScript 访问 JSF 组件的方法  (2007-10-30 14:18:21)
 ·JavaScript实现仿Windows关机效果  (2007-10-30 14:14:42)
 ·JavaScript去除空格的三种方法  (2007-10-30 14:07:32)
 ·用Javascript评估用户输入密码的强度  (2007-10-30 14:06:19)
 ·JavaScript处理事件:单击事件onClick  (2007-10-30 14:01:38)