JavaScript事件冒泡机制和阻止事件冒泡及默认事件

时间:2024-01-20 08:14:03

一、阻止事件冒泡:

  1、html中加return false

  2、js中加return false

  3、IE下:window.event.cancelBubble = true;

     FF下:event.stopPropagation();

//阻止事件冒泡函数
function stopBubble(evt)
{
  var e = evt || window.event;
if (e && e.stopPropagation)
e.stopPropagation()
else
window.event.cancelBubble=true
}

二、阻止默认事件:

  1、return false;

  2、IE下:window.event.returnValue = false;

     FF下:event.preventDefault()

//阻止浏览器的默认行为
function stopDefault( evt ) {
//阻止默认浏览器动作(W3C)
  var e = evt || window.event;
if ( e && e.preventDefault )
e.preventDefault();
else //IE中阻止函数器默认动作的方式
window.event.returnValue = false;
return false;
}

  return false作用很强大,不仅可以阻止事件冒泡,还可以阻止浏览器的默认行为,还可以减少ie系列的bug。

三、术语简介:

  那么什么是默认行为呢?就是浏览器会对一些元素默认给予一定的操作,比如a,input[type='submit']等等,默认行为是在事件绑定事件之后执行的,因为在刷新页面的时候,绑定事件就从历史记录里移出了,所以绑定事件要先执行(查看w3c)。

  事件对象,event是事件函数触发产生的局部变量,随事件触发而产生,随事件结束而消失。

  事件冒泡,就是当在dom结构中,子元素发生的事件,会沿着dom树神经一直传到document上,而不是单单只在本元素发生事件。

  所以,对于事件冒泡和浏览器的默认行为,作为事件对象,自然有他自己的处理方法,e.stopPropagation() 和e.stopImmediatePropagation()都是用来阻止事件冒泡的。只是这两个方法有个区别,就是后面的方法不仅阻止了一个事件的冒泡,也把这个元素上的其他绑定事件也阻止了。而前者只是阻止一个绑定事件的冒泡,而不影响其他绑定事件执行。e.preventDefault()是用来阻止浏览器的默认行为的。

  return false很强大,可以同时阻止事件冒泡和浏览器的默认行为。所以,当你需要阻止默认行为,但是又需要让他有事件冒泡行为的时候,你就不能用return false咯。

四、事件冒泡:

  在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达了对象层次的最顶层,即document对象(有些浏览器是window)。

  打个比方说:你在地方法院要上诉一件案子,如果地方没有处理此类案件的法院,地方相关部门会帮你继续往上级法院上诉,比如从市级到省级,直至到*法院,最终使你的案件得以处理。

五、事件冒泡有什么作用

  1、事件冒泡允许多个操作被集中处理(把事件处理器添加到一个父级元素上,避免把事件处理器添加到多个子级元素上),它还可以让你在对象层的不同级别捕获事件

【集中处理例子】

<div onclick="eventHandle(event)" id="outSide" style="width:100px; height:100px; background:#000; padding:50px">
  <div id="inSide" style="width:100px; height:100px; background:#CCC"></div>
</div>
<script type="text/javascript">
//本例子只在外面盒子定义了处理方法,而这个方法一样可以捕获到子元素点击行为并处理它。假设有成千上万子元素要处理,难道我们要为每个元素加“onclick="eventHandle(event)"”吗?显然没有这种集中处理的方法来的简单,同时它的性能也是更高的。
function eventHandle(e){
var e=e||window.event;
var obj=e.target||e.srcElement;
alert(obj.id+' was click')
}
</script>

  2、让不同的对象同时捕获同一事件,并调用自己的专属处理程序做自己的事情,就像老板一下命令,各自员工做自己岗位上的工作去了。

【同时捕获同一事件例子】

<div onclick="outSideWork()" id="outSide" style="width:100px; height:100px; background:#000; padding:50px">
  <div onclick="inSideWork()" id="inSide" style="width:100px; height:100px; background:#CCC"></div>
</div>
<script type="text/javascript">
function outSideWork(){
alert('My name is outSide,I was working...');
}
function inSideWork(){
alert('My name is inSide,I was working...');
}
//单击灰色盒子,从这里开始下命令,这样因为冒泡的原因,黑色大盒子也会收到单击事件,并调用了自己的处理程序。如果还有更多盒子嵌套,一样道理。
</script>

六、需要注意什么

  1、事件捕获其实有三种方式,事件冒泡只是其中的一种:(1)IE从里到外(inside→outside)的冒泡型事件。(2)Netscape4.0从外到里(outside→inside)的捕获型事件。(3)DOM事件流,先从外到里,再从里到外回到原点(outside→inside→outside)的事件捕获方法。

  2、不是所有的事件都能冒泡。以下事件不冒泡:blur、focus、load、unload。

  3、事件捕获方式在不同浏览器,甚至同种浏览器的不同版本中是有所区别的。如Netscape4.0采用捕获型事件解决方案,其它多数浏览器则支持冒泡型事件解决方案,另外DOM事件流还支持文本节点事件冒泡。

  4、事件捕获到达顶层的目标在不同浏览器或不同浏览器版本也是有区别的。在IE6中HTML是接收事件冒泡的,另外大部分浏览器将冒泡延续到window对象,即……→body→documen→window。

  5、阻止冒泡并不能阻止对象默认行为。比如submit按钮被点击后会提交表单数据,这种行为无须我们写程序定制。