Может ли перекрывающийся брат предотвратить Событие? - PullRequest
2 голосов
/ 12 октября 2009

Ниже приведен код для простого проекта ActionScript Flex. Спрайт частично покрывает гиперссылку. Происходит следующее: когда вы наводите курсор мыши на спрайт, если вы тоже наводите курсор мыши на гиперссылку, гиперссылка активируется. Я хочу предотвратить это. Я хочу, чтобы гиперссылка была активирована только тогда, когда на нее наведена мышь, но не на мышь, которая накрывает спрайт, который ее охватывает.

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 ]

1 голос
/ 17 октября 2009

Я почти нашел обходной путь. Просто поразительно, что нет какого-либо объекта, который можно поместить поверх текстового поля, чтобы он не видел, как мышь перекрывает гиперссылку.

Вот, для протокола, некоторые вещи, которые я пробовал.

stopPropagation () // не работает stopImmediatePropagation (P // не работает

Поскольку текстовое поле и спрайт являются одноуровневыми элементами в списке отображения, я думаю, что все, что касается распространения событий, не имеет значения. Все это имеет отношение к предкам и потомкам, но то, с чем мы имеем дело, не является ни тем, ни другим.

Я попытался поместить другое ('обложка') текстовое поле поверх текстового поля 'target'. Я попытался установить cover.visible = false; но это просто означало, что его там не было. Я попытался установить его альфа на .1, но это тоже не сработало - так же, как и спрайт покрытия, он позволял mouseOver проходить через него, так что гиперссылка отвечала.

Я думал о попытке использовать protectDefault () для гиперссылки, но а) я не знаю, как ссылаться на гиперссылку (у нее нет идентификатора) и б) единственное событие, которое отправляется из гиперссылки, - это TextEvent, и вот когда он нажал. Мы не щелкаем, мы зависаем. Так что я не знаю, какое событие отменить.

Еще одна вещь, которую я подумал сделать, это что-то вроде фальшивого «отмена». То есть, возможно, я мог бы задать формат текста или стиль гиперссылки, чтобы она выглядела как обычный текст, когда мышь наведена на спрайт. Гиперссылка на самом деле будет активирована, но она будет выглядеть , как будто она не активируется, потому что стиль будет изменен. Это то, что сработало.

Но это всего лишь фальшивый визуальный обходной путь ...

0 голосов
/ 14 октября 2009

Я никогда не видел такого поведения раньше. Ваш пример кода даже не назначает события. Мне было бы любопытно посмотреть, как вы назначаете события, потому что это само по себе может стать причиной вашей проблемы.

0 голосов
/ 12 октября 2009

Я бы добавил обработчик события rollOver (или любого другого события, которое вы пытаетесь заблокировать) в спрайт поверх гиперссылки. В обработчике ролловера обязательно вызовите event.stopImmediatePropagation (), и это должно препятствовать получению события гиперссылкой внизу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...