事件冒泡

有这么一段小程序

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Document</title>
 6 </head>
 7 <link rel="stylesheet" type="text/css" href="css/style.css">
 8 <script type="text/javascript" src="../jquery/jquery-1.3.1.js"></script>
 9 <script type="text/javascript">
10     $(function(){
11     $('#panel h5.head').click(function{
12         $(this).next().show();
13         })
14     })
15 </script>
16 <body>
17 <div id="panel">
18     <h5 class="head">什么是jQuery?</h5>
19     <div class="content">
20         jQuery是继Prototype之后又一个优秀的JavaScript库,它是一个由 John Resig 创建于2006年1月的开源项目。jQuery凭借简洁的语法和跨平台的兼容性,极大地简化了JavaScript开发人员遍历HTML文档、操作DOM、处理事件、执行动画和开发Ajax。它独特而又优雅的代码风格改变了JavaScript程序员的设计思路和编写程序的方式。
21     </div>
22 </div>
23 </body>
24 </html>

运行,华丽丽的一个错误,为什么 ,为什么 ,选择器没错吧,事件没错吧,那你效果为什么不出来,旁边同事来了句,事件冒泡~~~

于是百度后,代码改成介个样子:

1 <script type="text/javascript">
2     $(function(){
3     $('#panel h5.head').bind('click',function(){
4         $(this).next().show();
5         });
6     })
7 </script>

OK,问题解决了,接下来对事件冒泡做个解释

一、什么是事件冒泡

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

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

二、什么是事件冒泡

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

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

三、阻止事件冒泡

通常情况下我们都是一步到位,明确自己的事件触发源,并不希望浏览器自作聪明、漫无目的地去帮我们找合适的事件处理程序,即我们明确最精准目标,这种情况下我们不需要事件冒泡。另外通过对事件冒泡的理解,我们知道程序将做多较多额外的事情,这必然增大程序开销。还有一个重要的问题是:事件冒泡处理可能会激活我们本来不想激活的事件,导致程序错乱,甚至无从下手调试,这常成为对事件冒泡不熟悉程序员的棘手问题。所以必要时,我们要阻止事件冒泡。

看上面的例子,在没有阻止事件冒泡之前,其实是#panel的click事件,而不是我们选择的.head对象的事件,用bind(),live(),delegate() 方法,阻止事件冒泡。

原文地址:https://www.cnblogs.com/miaomiaomiao/p/4977607.html