这一个朋友遇到的问题,简单描述就是,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}}
{{child.content}}
{{question.question}}
提交