让as2事件冒泡

  •   2009-07-08/16:14
  •   这一个朋友遇到的问题,简单描述就是,as2只能触发元件上的动作,而元件内部包含的按钮的动作无法触发。

    因为碰到这问题,搜索到下面来自Elliot的日志——AS3 event flow 事件冒泡机制,对as2的事件机制有了进一步的了解。

    -----------------------------原文节选----------------------------------------

    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中还能实现么?答案自然是肯定的,不过方法就复杂了。

    ……

    然后有两张图说明as2和as3的事件机制之不同:

    -----------------------------------------------到此原因就清楚了。

    那看来as2下,让一个安钮或mc和它们的父级mc上的事件都有效,必然要在使用完父级触发事件后暂时删除以解放子级触发事件。

    怎么as2下解决这个问题,做了一个小例子,代码写得不好,但基本实现了意图:

    xs._visible = false;
    p1 = {x:_mc._x, y:_mc._y};
    p2 = {x:_mc2._x, y:_mc2._y};
    _mc.onRollOver = dy;
    _mc2.onRollOver = dy2;
    _mc.hmc.onRelease = function() {
    trace("我是嵌套的mc");
    xs._visible = !xs._visible;
    };
    _mc2.b2.onRelease = function() {
    trace("我是嵌套的mc2");
    xs._visible = !xs._visible;
    };
    function dy() {
    trace("我是父级的mc");
    变化(_mc, _mc2);
    _mc2._x = p2.x;
    _mc2._y = p2.y;
    delete _mc.onRollOver;
    _mc2.onRollOver = dy2;
    }
    function dy2() {
    trace("我是父级的mc2");
    变化(_mc2, _mc);
    _mc._x = p1.x;
    _mc._y = p1.y;
    delete _mc2.onRollOver;
    _mc.onRollOver = dy;
    }
    function 变化(m:MovieClip, n:MovieClip) {
    m.swapDepths(100);
    m._xscale = 200;
    m._yscale = 200;
    m._x = Stage.width/2;
    m._y = Stage.height/2;
    n._xscale = 100;
    n._yscale = 100;
    }


    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多