javascript_事件&冒泡
来源:互联网 发布:淘宝飞猪怎么开店 编辑:程序博客网 时间:2024/06/06 18:37
javascript的事件在两个阶段执行:捕获和冒泡。一旦元素触发事件,那么允许处理事件的元素和顺序都大有不同。图1演示了在页面上用户点击标签<a>是的执行顺序。
图1
例1演示了当鼠标放到标签li上时候有背景色而离开后变白
例1:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title></title>
<script type="text/javascript">
window.onload = function(){
var lis = document.getElementsByTagName("li");
for(var i = 0;i<lis.length;i++){
lis[i].onmouseover = function(){
this.style.backgroundColor = "blue";
}
lis[i].onmouseout = function() {
this.style.backgroundColor = "white";
}
}
}
</script>
</head>
<body>
<ul>
<li><a href="#">one</a></li>
<li><a href="#">two</a></li>
<li><a href="#">three</a></li>
</ul>
</body>
</html>
在这个例子中可以看到程序很好的工作了,但你没有没考虑当把鼠标放到标签<a>上时<li>也达到了效果。这就是冒泡,当鼠标放到标签<a>上,标签<a>并没有注册事件,按照图1,他会冒泡到标签<li>上处理<li>上的事件所以<li>还是会在变色也不变之间切换。看完这个例子是不是觉得javascript很强大。
但是在我们不需要冒泡的时候我们能阻止他吗?我们先来看一个不需要冒泡的例子
例2:
例2我想对所有的标签,当鼠标移动上去的时候让它有个边框,当鼠标移走的时候停止显示边框,于是我很快的做出了相应的程序
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title></title>
<script type="text/javascript">
window.onload = function(){
var all = document.getElementsByTagName("*");
for(var i = 0;i < all.length;i++){
all[i].onmouseover = function(e){
this.style.border = "1px solid red";
}
all[i].onmouseout = function(e){
this.style.border = "0px";
}
}
}
</script>
</head>
<body>
<ul>
<li><a href="#">one</a></li>
<li><a href="#">two</a></li>
<li><a href="#">three</a></li>
</ul>
</body>
</html>
效果如图
显然不对。结合前面所介绍的冒泡相信大家很容易发现问题的所在。没错在我鼠标放到<a>标签上的时候<a>有处理了onmouseover事件,由于冒泡<li><ul>...都处理了绑定的鼠标事件。很纠结。
解决办法:
在解决中我们还要注意IE于W3C标准有不同
IE是在window.event下注册了cancelBubble属性,设置为true会阻止冒泡。
W3C标准是设定了stopPropagation()函数来阻止冒泡。
我们来看解决程序
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title></title>
<script type="text/javascript">
window.onload = function(){
var all = document.getElementsByTagName("*");
for(var i = 0;i < all.length;i++){
all[i].onmouseover = function(e){
this.style.border = "1px solid red";
stopBubble(e);
}
all[i].onmouseout = function(e){
this.style.border = "0px";
stopBubble(e);
}
}
}
function stopBubble(e){
if(e && e.stopPropagation){
e.stopPropagation();
} else{
window.event.cancelBubble = true;
}
}
</script>
</head>
<body>
<ul>
<li><a href="#">one</a></li>
<li><a href="#">two</a></li>
<li><a href="#">three</a></li>
</ul>
</body>
</html>
红色部分是阻止冒泡函数。
- javascript_事件&冒泡
- javascript_取消事件冒泡
- javascript_事件
- javascript_事件对象
- javaScript_理解DOM事件
- JavaScript_基础_事件
- JavaScript_进阶_DOM事件处理
- JavaScript_事件、函数、变量作用域
- 事件冒泡
- 事件 冒泡
- 冒泡事件
- 冒泡事件
- 事件冒泡
- 冒泡事件
- 事件冒泡
- 事件冒泡
- 事件冒泡
- 事件冒泡
- C# 序列化和反序列化
- Producer Consumer 模式
- work之日程
- c++编程修养
- 几款作战仿真类产品介绍
- javascript_事件&冒泡
- string.Format字符串格式化说明
- ssh 整合
- android 使用 googleMap
- C++笔试题——华为
- ORA-18008
- c/c++笔试题大解析
- 回顾时光 详解HTML的发展史
- linux下用RVDS4.0进行裸机开发