【初窥javascript奥秘之事件冒泡】那些年我们一起冒的泡

原文http://www.cnblogs.com/yexiaochai/archive/2013/04/23/3037064.html

【初窥javascript奥秘之事件冒泡】那些年我们一起冒的泡

前言

若是我说会有此文又是因为一次面试的话,我自己都不知道该怎么形容我的心情了,好似我的所有动力皆来自于面试似的。

其实不是这样的,我原来一个项目经理对我说,隔一两个月出去面试下,一来你会知道自己的不足知道怎么提高,二来你就知道自己涨价没。

现在回想起来他说的是很对的,面对这次的团队解散,我反而不那么着急,因为我不太惧怕面试,走到哪里都能找到工作,当然这里没有鼓励大家出去面试的意思啦。

回到本文,当时面试官问了我一个问题,我当时就支支吾吾的答不上来,其实细细思考的话这道题还是有点意思的:

在一个div上画div(绝对定位),然后再在刚刚那个div里面(上面更合适)画一个div,现在去拖到div,你知道你拖动的是哪个div吗?

说这道题本身并不难绝对是骗人的(反正时至今日我都有点没底...),说他难,他又没有难到哪里去,每个人都知道是事件冒泡相关的东西。

还是那句话知道不等于了解,了解不等于深入,皮毛说不清楚事情,今天让我们带着问题一起学习吧!

由于本文是边学边写的,可能会有点乱,可能会有我的唧唧歪歪请各位大哥见谅。

基础知识

刀不磨不亮,我们先从基础来,这里就直接忽略IE的attachEvent了吧,我们说下标准的就是,请看以下代码(这里我确实没脸再用jquery了,原生吧):

基础事件绑定

我们看到点击按钮后,执行点击事件,其中this便是对应元素,e包含了许多有用信息比如:

阻止冒泡(e.stopPropagation();)、阻止浏览器默认事件(e.preventDefault();)、当前点击元素、鼠标位置......

好,我们在此基础上做一个扩展,我们多增加两个元素,然后给document绑定事件,最后看看我们点击的是哪个:

 1 <body>
 2     <div id="div">
 3         <input id="input" value="点击我" type="button" />
 4         <ul>
 5             <li><a>湿湿的</a></li>
 6             <li><a>湿湿的1</a></li>
 7             <li><a>湿湿的2</a></li>
 8         </ul>
 9         <span>安能辨我<b>是</b>雄雌</span>
10     </div>
11     <script type="text/javascript">
12         document.addEventListener('click', function (e) {
13             var scope = this;
14             var cur_el = e.target.tagName;
15             var s = '';
16         }, false);
17     </script>
18 </body>

现在我不论点击哪个标签皆会将其标签名字打印出来,请在s=''处设置断点查看:

于是我突然感觉知道了什么,又不能确认,所以我们都不敲板,来捋一捋:

1 我们为根元素绑定点击事件
2 我们点击按钮后,按钮并没有事件处理,所以将事件向上传递,直到document3 document是绑定了事件的,所以触发了事件,其中this指向document,但是e中的当前点击元素却是按钮

好,先将一切暂停,我们来做一个很土的选项卡:

丑陋的选项卡

若是现在需要完成一个简单功能,点击每个选项卡,内容区域文字便会变成选项卡的标签文字你会怎么做呢?

很多年以前,我会使用jquery的标签选择器为每个li添加事件,我确信我会这样做,这样做有几个问题:

1 事件绑定过多

2 动态添加li标签的话,是不具备事件的

于是这里我们就可以用到前面的事件冒泡机制啦:

选项卡代码完整版

根据这个例子,我相信,各位都对事件冒泡有一个认识了,我们继续。

绝对定位·乱了的一切

这里会说到绝对定位,只是因为他比较特殊,其实漂浮、元素之间重叠都有可能让我们的冒泡变得复杂,先上代码:

复杂的情况

现在各位还知道自己在干什么吗???这个将情况变的复杂,因为我们必须清晰的知道谁离我最近。

解决问题

到了解决问题的时候了,要不我们将最开始出现那道题做了吧?我们先规定一下做法,只能这样做哟:

1 给一个按钮给用户让用户选择现在是画矩形或者拖动矩形

2 在给定的一个div(相对定位)中画div,画的div(绝对定位)将append到父div里面

3 选择拖动div,便可在父层div中进行拖动了

4 不能为除父div以为的div添加事件!

5 可以使用jquery,可以暂时不考虑滚动条

怎么样简单吧,让我们动手吧:

为了方便各位拖到,我先上个图,然后再来一段丑陋的代码:

丑陋的代码

大家去运行看看,就会发现问题了:

我们拖动1时,没有问题,但是当我们拖到0时,一旦碰到1就会出状况!!!

这是因为我们mousedown事件是绑定到了父div上,当我们鼠标点下时,便给个元素绑定了滑动事件,但是在1

上时,因为他离我们近,所以我们不会滑动到0上,。。。。滑动0时碰到1,鼠标自然就在1

上滑动了,所以拖动的就是1。。。。

我不知道各位晕不晕,我可能有点晕,今天暂时如此了。。。。

师兄讨论的结果

刚刚和师兄就这个问题做了一个讨论,他的意见还是很中肯的:

我们mousedown的时候便获取该元素,然后直接给该子元素绑定各种事件,mouseup后便把事件取消,便不会有以上问题了,

另外可能起z-index还需要进行设置,我这里就不管了:

师兄意见

 

结语

小弟对冒泡机制理解还是很浅的,若是各位大哥看到此文觉得有什么不足,或者有什么问题,请一定指出来哦。

另外那道题建议各位做下,我那个代码写得有点水,期待高质量的代码。。。。

如果你觉得这篇文章还不错,请帮忙点击一下推荐,谢谢!

时间: 2025-01-01 17:28:21

【初窥javascript奥秘之事件冒泡】那些年我们一起冒的泡的相关文章

【初窥javascript奥秘之Ajax】简述下你所知道的Ajax?

原文 http://www.cnblogs.com/yexiaochai/archive/2013/04/24/3037069.html [初窥javascript奥秘之Ajax]简述下你所知道的Ajax? 前言 ajax已经流行很多年了,现在来说它是否已经晚了呢???特别是有这样框架那样框架后,还有几个人认识原生ajax呢?我们每天都会用到的东西你到底对他了解吗? 在最近一次面试上不幸被问到了,原以为很熟悉的东西你会发现你对他根本不熟悉!要说熟悉AJAX的话你需要毫不犹豫回答以下问题: 1 不

JavaScript权威设计--事件冒泡,捕获,事件句柄,事件源,事件对象(简要学习笔记十八)

1.事件冒泡与事件捕获 2.事件与事件句柄   3.事件委托:利用事件的冒泡技术.子元素的事件最终会冒泡到父元素直到跟节点.事件监听会分析从子元素冒泡上来的事件. 事件委托的好处:     1.每个函数都是对象,都会占用内存,内存中对象越多,性能越差.     2.必须事先指定所有事件处理程序而导致的DOM访问次数,会延迟整个页面的交互就绪时间. 怎样处理由于事件较多引起的性能差: 1.采用事件委托技术,限制简历的连接数量 2.在不需要的时候移除事件处理程序 例子: html: <div id=

javascript里阻止事件冒泡

如下图所示,灰色块包含红色块,假设我们为灰色和红色块各绑定一个单击弹框事件,当我们点击红色块时,不希望触发灰色块的弹框事件,这就需要阻止冒泡事件了.   IE里阻止冒泡事件使用cancelBubble属性,如果事件句柄想阻止事件传播到包容对象,必须把该属性设为 true. 火狐等非IE浏览器阻止冒泡事件使用stopPropagation()方法.调用该方法后,该节点上处理该事件的处理程序将被调用,事件不再被分派到其他节点.   我们看代码实例: <!doctype html> <html

理解jquery事件冒泡_jquery

一.什么是jquery事件冒泡 在很多教材或者手册都可能会涉及到事件冒泡的概念,老手来说这当然是最基本的概念,但往往对于初学者可能比较陌生或者说从来没有听说过.下面就结合代码实例来简单介绍一下什么是事件冒泡. 代码实例如下: <html> <head> <meta charset=" gb2312"> <title>事件冒泡</title> <script type="text/javascript"

JavaScript和JQuery的鼠标mouse事件冒泡处理

  这篇文章主要介绍了JavaScript和JQuery的鼠标mouse事件冒泡处理,本文总结出了mouse事件的一些定论,并分别给出了JavaScript和JQuery测试代码,需要的朋友可以参考下 简单的鼠标移动事件: 进入 代码如下: mouseenter:不冒泡 mouseover: 冒泡 不论鼠标指针穿过被选元素或其子元素,都会触发 mouseover 事件 只有在鼠标指针穿过被选元素时,才会触发 mouseenter 事件 移出 代码如下: mouseleave: 不冒泡 mouse

javascript事件冒泡和事件捕获详解

  最近在学习javascript中遇到了一些困难,比如冒泡和捕获,很多次被提到,但又不知究竟应用在何处.找到了一些好文章解惑,在这里分享给大家. 事件冒泡和事件捕获分别由微软和网景公司提出,这两个概念都是为了解决页面中事件流(事件发生顺序)的问题. ? 1 2 3 <div id="outer"> <p id="inner">Click me!</p> </div> 上面的代码当中一个div元素当中有一个p子元素,如

javascript事件冒泡实例分析

  本文实例讲述了javascript事件冒泡.分享给大家供大家参考.具体分析如下: 事件冒泡: 如果元素A嵌套在元素B中,那么A被点击不仅A的onclick事件会被触发,B的onclick也会被触发, 触发的顺序是"由内而外".验证:在页面上添加一个table,table里有tr,tr里有td,td里放一个p, 在p,td,tr,table中添加事件响应 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <html xmlns="htt

阻止JavaScript事件冒泡传递(cancelBubble 、stopPropagation)_javascript技巧

cancelBubble在IE下有效 stopPropagation在Firefox下有效 复制代码 代码如下: <!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

javascript事件冒泡详解和捕获、阻止方法_javascript技巧

一.事件的发生顺序 这个问题的起源非常简单,假设你在一个元素中又嵌套了另一个元素 复制代码 代码如下: ----------------------------------- | element1                        | |   -------------------------     | |   |element2               |     | |   -------------------------     | |