`

AS3 event flow 事件冒泡机制 以及 stopImmediatePropagation() stopPropagation()用法

    博客分类:
  • AS
阅读更多

http://yzzelliot.spaces.live.com/blog/cns!5428063AEA721F64!875.entry

学了这长时间时间,基本的都不懂

AS3 event flow 事件冒泡机制 以及 stopImmediatePropagation()
stopPropagation()

大家好,今天亦乐首次为大家带来flash actionscript转载教程。首先声明出处(我自己是没时间写教程啦,要直接找我讨论还好)

  版权声明 :转载时请以超链接形式标明文章原始出处和作者信息及 本声明
http://goday.blogbus.com/logs/14062836.html

 

今 天,我也正式宣布,开始成为闪客,以往对macromedia flash的许多头疼问题都被adobe解决了,以往一直否认我喜欢做flash,现在总算可以为adobe flash 自豪。非常有系统的developing方式。RIA 平台, on screen project就不这里说了。

 

这期带来的是flash极重要元素之一,event事件。在游戏里就是所谓的Trigger. Adobe改良后的,大家谓称的“冒泡机制”。有问题欢迎发问指教。

 

=思路大纲=

  1. ActionScript 2的问题
  2. AS3解决问题
  3. 结合问题,说明“冒泡”
  4. 冒泡的问题所在以及解决方法


1 - ActionScript 2的问题

stage里有一个mc,mc里有一个btn
点选mc实现拖动mc,鼠标松开停止拖动
点选mc实现mc隐藏。
最容易想到的方法,代码如下:

mc.onPress = function() {
        this.startDrag();
};
mc.onRelease = function() {
        this.stopDrag();
};
mc.btn.onPress = function() {
        mc._visible=false
};

表面来看,这个思路是正确的。(实际上没什么思路可言,很简单的方法。)
实际怎么样?当然是不能实现。
问题:点击btn,不能触发btn的动作!!!!
解释:  因为btn处于mc内部,mc被加上了事件以后,按照as2的事件机制,mc内部的btn甚至是其他的元件都不能接受事件。或者可以认为mc的事件覆盖了mc中其他元件的事件。
从 非冒泡机制来说,在btn上点击鼠标,首先接受到点击事件的自然是btn的上一层(也就是mc),然后才是btn元件。Mc先接受到点击事件,触发相关的 函数。然后呢?我们要实现的点击btn的效果没了。我们可以认为mc把我们的鼠标点击事件据为私有了,不再往下传递。(如果是冒泡机制的话,这个动作就回 继续往下传递到btn,然后btn会执行。)那么这种效果在as2中还能实现么?答案自然是肯定的,不过方法就复杂了。
这里就不讨论了。As3已经成为主流。
但是as3中的冒泡机制,让我们可以简单的解决这样的难题。

2 - AS3解决问题

下面来看as3中怎么实现。
代码如下:

import flash.events.*;
mc.addEventListener(MouseEvent.CLICK,mcfunction);
mc.btn.addEventListener(MouseEvent.CLICK,btnfucntion);

function mcfunction(event:MouseEvent) {
        trace("mc click");
}
function btnfucntion(event:MouseEvent) {
        trace("btn click");
}

 

看看代码就觉得,好像没用什么特别的解决方法,就加两个侦听函数,就搞定了。
这个代码自然的不能再自然了,就好像做flash 先的安装软件一样。
但是如此自然的代码下面,使AS3的冒泡机制在提供支持。

3 - 结合问题,说明冒泡机制:
Help中有一个冒泡机制的图,相信大家都已经看过了
这里我联系实例,另外做一个图,帮助各位理解。

2D2D13C9009ACC1FF3AADD80E5C4FB85

上图为as2中的执行原理
下图为as3中的执行原理
 2D8D966808DAEEA2C9701B5E09B334FE
上图也就是在as3中实现我们文章开始提出的例子的工作原理。
下面详细描述一下

捕获阶段:
鼠 标在btn上发出点击事件,首先捕捉到该事件的事stage.,然后事件往下传递到mc,再到btn..(如果鼠标事件发生在btn按钮中的一个 label上,那么该事件还会继续向下传递,直到找到label元件。)AS2中,一旦找到了可以相应事件的函数,就停止了,不会往下传递。这个道理应该 说明白了
目标阶段
找到我们的鼠标最底层的目标,也就是btn以后,那么就开始执行btn的侦听函数了。
    如果鼠标事件发生的所在位置,是mc中的btn中的一个label。那么将先执行label的侦听函数。(当然我们的例子中没有label)
冒泡阶段:
执行了目标阶段的侦听函数以后,开始冒泡。
换一个说法是,返回btn的父级元件mc,如果能找到相关的侦听函数,那么就执行,如果没有,就继续往上冒泡到btn的父级元件mc的父级元件stage。看能不能找到相关的侦听函数。

注 意一个:首先执行的函数一定是目标对象的侦听函数。就像我们上面的例子一样,点击btn会先trace(“btn click”),然后冒泡到mc,执行trace(“mc click”)..然后继续往上,如果stage我们也加一个侦听函数,执行语句,那么还会继续执行 trace(“stage click”).
到达stage顶层了,冒泡结束。
说到这里,各位看官也应该明白了as3的冒泡究竟是干什么用的了

4 - 冒泡的问题所在以及解决方法
  冒泡也有问题,并不是说它有缺陷,因为出现问题无法避免。
  问题在于,
  假如在上面的例子中,我们不想在点击btn冒泡阶段中执行mc的侦听函数,我们只想执行btn的侦听函数。怎么解决?
同样的问题延伸出去,可以得到很多扩展和应用。
那么我们需要阻止他的冒泡的时候执行相关的侦听函数。
Chm中的方法有

stopImmediatePropagation():void
防止对事件流中当前节点中和所有后续节点中的事件侦听器进行处理。
stopPropagation():void
防止对事件流中当前节点的后续节点中的所有事件侦听器进行处理。

用来修改我们上面的例子
代码如下:

import flash.events.*;
mc.addEventListener(MouseEvent.CLICK,mcfunction);
mc.btn.addEventListener(MouseEvent.CLICK,btnfucntion);
function mcfunction(event:MouseEvent) {
        trace("mc click");
}
function btnfucntion(event:MouseEvent) {
        trace("btn click");
        event.stopPropagation();//修改在此处。简单一句,解决问题
}

现在可以试试,点击btn运行得到的结果就是

代码:
btn click

说明,已经防止了冒泡阶段中对mc侦听函数的处理。也就没有trace(“mc click”)了
As3事件机制远远不像这里写的那么简单,还有很多东西需要研究。
本文只为抛砖引玉,让各位能先了解一下冒泡机制。
希望能多的朋友能提供相关的学习资料

分享到:
评论

相关推荐

    javascript阻止事件冒泡的一种方法

    阻止事件冒泡的方法主要有两种:`event.stopPropagation()` 和 `event.stopImmediatePropagation()`。这两种方法在不同的场景下有不同的应用。 1. `event.stopPropagation()` 这个方法可以阻止事件继续在DOM树中...

    【JavaScript源代码】JavaScript中事件冒泡机制示例详析.docx

    这可以通过在事件处理函数中使用`event.stopPropagation()`来阻止事件继续冒泡,或者使用`event.stopImmediatePropagation()`来立即停止所有后续的事件处理。 总之,理解JavaScript中的事件冒泡机制对于编写高效的...

    事件冒泡

    3. 这个过程会一直持续,直到事件到达文档的根节点,或者被某个中间节点的事件处理器阻止(使用`event.stopPropagation()`方法)。 这种机制使得我们可以方便地在祖先元素上处理多个子元素的事件,而无需为每个子...

    JS事件冒泡浏览器兼容

    此外,`event.stopPropagation()`方法可以阻止事件继续向上冒泡,而`event.stopImmediatePropagation()`则不仅可以阻止冒泡,还能阻止同一元素上的其他事件处理函数被执行。 总结一下,JavaScript事件冒泡是浏览器...

    jquery阻止事件冒泡

    除了`stopPropagation()`,jQuery还提供了`event.stopImmediatePropagation()`方法,它不仅阻止当前事件的冒泡,还会停止同一事件在同一元素上其他事件处理程序的执行。如果一个元素有多个相同的事件监听器,这会...

    flash as3 的例子

    6. **事件冒泡和阻止**:`stopPropagation`方法可以阻止事件继续冒泡到父级节点,而`stopImmediatePropagation`则阻止同一事件在当前目标上触发其他监听器。 7. **事件委托**:在大型项目中,事件委托是一种优化...

    JavaScript事件冒泡示例.html

    为了防止事件冒泡,可以使用`event.stopPropagation()`方法,阻止事件继续向上冒泡;而`event.stopImmediatePropagation()`不仅可以阻止冒泡,还能阻止同一元素上的其他事件处理程序被执行。 在实际应用中,事件...

    JQuery 提供了两种方式来阻止事件冒泡.rar

    在阅读提供的"JQuery提供了两种方式来阻止事件冒泡.pdf"文件时,你将更深入地理解这些方法的工作原理、用法以及它们在不同场景下的最佳实践。记得结合实际代码示例进行学习,这将有助于更好地掌握这些技术。

    阻止浏览器的默认事件和冒泡

    ### 阻止浏览器的默认事件和冒泡 ...通过以上介绍,我们可以了解到在实际开发中如何有效地使用JavaScript来控制和管理浏览器的默认事件以及事件的冒泡机制,从而实现更复杂的功能和更好的用户体验。

    JS冒泡事件与事件捕获实例详解

    在事件捕获的阶段,同样可以在事件处理函数中调用event.stopPropagation()方法来停止事件继续向下传播,但更多情况下开发者会使用event.stopImmediatePropagation()来阻止同一层级中其他事件监听器的执行。...

    JavaScript 事件冒泡简介及应用

    为了更好地控制事件冒泡,开发者可以使用`event.stopPropagation()`方法来阻止事件继续向上冒泡,或者使用`event.stopImmediatePropagation()`防止其他在同一元素上注册的事件处理程序被执行。这些技巧在处理复杂...

    js如何取消事件冒泡

    在JavaScript中,事件冒泡(Event Bubbling)是一种事件处理机制,它描述的是事件从最深的DOM节点开始,然后逐级向上层节点传播事件的过程。例如,如果你点击一个按钮,该点击事件首先会在按钮元素上触发,然后依次...

    window.event 对象详解

    在JavaScript编程语言中,`window.event`对象是一个特殊对象,它与浏览器的事件处理机制紧密相关。这个对象在大部分浏览器环境中(尤其是老版本的IE)是全局可用的,提供了当前事件的相关信息。本文将深入探讨`...

    javascript防止事件传播

    例如,如果你想阻止事件冒泡但不阻止其默认行为,使用`stopPropagation()`;如果你还需要阻止同一元素上其他处理函数的执行,那么`stopImmediatePropagation()`更为合适。 测试示例(test.html): ```html <!...

    JavaScript中使用stopPropagation函数停止事件传播例子

    如果你想完全取消事件的处理,应该使用`event.stopImmediatePropagation()`,这样可以防止当前元素上其他监听相同事件的处理函数被执行。 了解并熟练运用`event.stopPropagation()`对于编写高性能、低耦合的...

    JQuery中DOM事件冒泡实例分析

    总结来说,在JQuery中处理DOM事件冒泡时,要熟悉事件对象的使用、stopPropagation()方法来停止事件冒泡、preventDefault()方法来阻止默认行为以及stopImmediatePropagation()方法来阻止事件继续传播到其他事件处理器...

    Event

    5. **停止事件传播(Stopping Propagation)**:如果希望阻止事件继续向上冒泡,可以使用`event.stopPropagation()`。 6. **自定义事件(Custom Events)**:除了浏览器提供的内置事件,我们还可以通过`new Event`...

    JS的Event事件对象使用方法

    本篇文章将深入探讨JS的Event事件对象的使用方法。 首先,我们来分析提供的代码片段: ```javascript function getEvent(event) { var ev = event || window.event; if (!ev) { var c = this.getEvent.caller; ...

    vu3 事件侦听和抛送模式

    也可以通过`event.stopPropagation()`阻止事件冒泡,或者`event.stopImmediatePropagation()`阻止同一事件链上的其他监听器执行。 总结来说,Vue 3的事件系统提供了一套强大的工具,让我们能够优雅地处理组件间的...

    flex事件讲解

    Flex遵循AS3(ActionScript 3)的事件模型,其中事件分为三个阶段:捕获阶段、目标阶段和冒泡阶段。事件从最外层的根节点开始传播,依次经过每个节点直到目标节点,然后反向传播回根节点。这种模型允许在不同层次的...

Global site tag (gtag.js) - Google Analytics