理解JavaScript的事件冒泡

本文通过实例演示了JavaScript中事件冒泡的概念及如何阻止事件冒泡。通过两个不同的DIV元素组,展示了当鼠标悬停在不同层级的元素上时,事件如何从最内层元素逐级向外触发,以及如何使用stopPropagation()来精确地捕获鼠标进入的元素。

http://www.blueidea.com/tech/web/2007/4628.asp

如果你还不理解JavaScript的事件冒泡往下看:

代码:
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
< html  xmlns ="http://www.w3.org/1999/xhtml"  lang ="zh"  xml:lang ="zh" >
< head >
< meta  http-equiv ="Content-Type"  content ="text/html; charset=UTF-8"   />
< meta  name ="developer"  content ="Realazy"   />
< title > Bubble in JavaScript DOM </ title >
< style  type ="text/css"  media ="screen" >
 div * 
{ display : block ;  margin : 4px ;  padding : 4px ;  border : 1px solid white ; }
 textarea 
{ width : 20em ;  height : 2em ; }
</ style >
< script  type ="text/javascript" >
    
// <![CDATA[
     function  init(){
  
var  log  =  document.getElementsByTagName('textarea')[ 0 ];
  
var  all  =  document.getElementsByTagName('div')[ 0 ].getElementsByTagName(' * ');
  
for  ( var  i  =   0 , n  =  all.length; i  <  n;  ++ i){
   all[i].onmouseover 
=   function (e){
    
this .style.border  =  '1px solid red';

    log.value 
=  '鼠标现在进入的是: '  +   this .nodeName;
   };
   all[i].onmouseout 
=   function (e){
    
this .style.border  =  '1px solid white';
   };
  }

  
var  all2  =  document.getElementsByTagName('div')[ 1 ].getElementsByTagName(' * ');
  
for  ( var  i  =   0 , n  =  all2.length; i  <  n;  ++ i){
   all2[i].onmouseover 
=   function (e){
    
this .style.border  =  '1px solid red';

    
if  (e)  // 停止事件冒泡 (重要部分)
     e.stopPropagation();
    
else
     window.event.cancelBubble 
=   true ;
    
    log.value 
=  '鼠标现在进入的是: '  +   this .nodeName;
   };
   all2[i].onmouseout 
=   function (e){
    
this .style.border  =  '1px solid white';
   };
  }
 }
 window.onload 
=  init;
    
// ]]>
</ script >
</ head >
< body >
< h1 > Bubble in JavaScript DOM </ h1 >
< p > DOM树的结构是: </ p >
< pre >< code >
UL
  - LI
     - A
   - SPAN
</ code ></ pre >
< div >
 
< ul >
  
< li >< href ="#" >< span > Bubbllllllllllllllle </ span ></ a ></ li >
  
< li >< href ="#" >< span > Bubbllllllllllllllle </ span ></ a ></ li >
 
</ ul >
</ div >
< textarea ></ textarea >
< p > 鼠标进入UL的任何一个子元素,如果不停止冒泡,我们从UL到SPAN都定义了鼠标悬停( < code > mouseover </ code > )事件,这个事件会上升了UL,从而从鼠标所进入的元素到UL元素都会有红色的边。 </ p >
< div >
 
< ul >
  
< li >< href ="#" >< span > Bubbllllllllllllllle </ span ></ a ></ li >
  
< li >< href ="#" >< span > Bubbllllllllllllllle </ span ></ a ></ li >
 
</ ul >
</ div >
< p > 如果停止冒泡,事件不会上升,我们就可以获取精确的鼠标进入元素。 </ p >
</ body >
</ html >

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值