重叠的兄弟会阻止事件吗?

时间:2009-10-11 23:08:20

标签: flex actionscript-3 events

下面是一个简单的Flex actionscript项目的代码。精灵部分覆盖超链接。发生的事情是,当您将鼠标悬停在精灵上时,如果您还将鼠标悬停在超链接上,则会激活超链接。我想防止这种情况。我希望只有当鼠标悬停在超链接上时才会激活超链接 - 但是当鼠标悬停在覆盖它的精灵上时不会激活。

package {

import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.TextEvent;
import flash.text.Font;
import flash.text.StyleSheet;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;


public class SpriteHyperlinkTest extends Sprite
{
    private var style : StyleSheet = new StyleSheet();
    public function SpriteHyperlinkTest()
    {
            createOutputTextField();
    }

    public var output_txt : TextField;

    private function createOutputTextField() : void {

            // set styles
            var hover : Object = new Object();
            hover.fontWeight = "bold";
            hover.color = "#0000FF";
            var link : Object = new Object();
            link.fontWeight = "bold";
            link.textDecoration = "underline";
            link.color = "#555555";
            var active : Object = new Object();
            active.fontWeight = "bold";
            active.color = "#FF0000";

            var visited : Object = new Object();
            visited.fontWeight = "bold";
            visited.color = "#cc0099";
            visited.textDecoration = "underline";

            style.setStyle("a:link", link);
            style.setStyle("a:hover", hover);
            style.setStyle("a:active", active);
            style.setStyle(".visited", visited);
            output_txt = new TextField();
            output_txt.backgroundColor = 0xFFFFFF;
            output_txt.background = true;
            //output_txt.embedFonts = true;
            output_txt.wordWrap = true;
            output_txt.multiline = true;

            output_txt.name = "output_txt";                 
            output_txt.x = 100;
            output_txt.y = 100;
            output_txt.width = 300;
            output_txt.height = 200;

            output_txt.htmlText = "<b>sample <a href='http://www.google.com'>hyperlink text</a></b>"; 
            addChild(output_txt);

     var mySprite:Sprite = new Sprite();
             mySprite.graphics.lineStyle(.5,0x000000);
     mySprite.graphics.beginFill(0xff0000, 1);
     mySprite.alpha = .7;
     mySprite.graphics.drawRect(100, 100, 90, 20);
     mySprite.graphics.endFill();
     mySprite.useHandCursor = true;
     mySprite.mouseChildren = true;
     mySprite.buttonMode = true;
     mySprite.name = "Sprite1";
     this.addChild(mySprite);

     output_txt.styleSheet = style;
    }

  }
}

3 个答案:

答案 0 :(得分:1)

我几乎找到了解决方法。令人惊奇的是,没有一些对象可以放在文本字段的顶部,以防止它看到鼠标覆盖超链接。

在这里,记录是我尝试过的一些事情。

stopPropagation()//无效 stopImmediatePropagation(P //无法正常工作

因为textfield和sprite是displaylist上的兄弟,我认为所有的事件传播都是无关紧要的。所有这一切都与祖先和后代有关,但我们在这里处理的并非如此。

我尝试在“目标”文本字段的顶部放置另一个(“封面”)文本字段。我试过设置cover.visible = false;但这只是意味着它实际上不存在。我尝试将其alpha设置为.1,但这也不起作用 - 就像覆盖精灵一样,它允许mouseOver通过它,以便超链接响应。

我想过尝试在超链接上使用preventDefault(),但是a)我不知道如何引用超链接(它没有ID)和b)从超链接调度的唯一事件是TextEvent,这就是点击它的时候。我们没有点击,我们正在徘徊。所以我不知道要取消什么活动。

我想做的另一件事是做一种假的“取消”。也就是说,当鼠标悬停在精灵上时,也许我可以将超链接的textformat或style设置为普通文本。超链接实际上会被激活,但它会看起来,因为它没有被激活,因为样式会被更改。这是有效的。

但这只是假的视觉解决方法......

答案 1 :(得分:0)

我会在超链接顶部的sprite中添加一个rollOver(或者你试图阻止的任何事件)事件监听器。在翻转处理程序中,一定要调用event.stopImmediatePropagation(),这样可以防止下面的超链接接收事件。

答案 2 :(得分:0)

我以前从未见过这种行为。您的示例代码甚至不分配事件。我很想知道你如何分配事件,因为这本身可能是你问题的原因。