In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

linkイベント発生はCLICKより速いからそこでもみ消すの巻

Get Adobe Flash player
by kawakita 14 Jan 2010

    Talk

    9re at 14 Jan 2010 06:58
    このアプローチの場合、 TextFieldのclickのハンドラは常にキャンセルし続けでremoveEventListenerする必要ないかもです
    Embed
/**
 * Copyright kawakita ( http://wonderfl.net/user/kawakita )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/p59v
 */

// forked from nariyu's イベント止めたいけど止められないす
package {
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.events.TextEvent;
	import flash.text.TextField;
	import flash.text.TextFormat;
	
	[SWF(width = "465", height = "465", backgroundColor = 0xFFFFFF)]
	public class LinkTest extends Sprite
	{
		private var sprite:Sprite;
		private var textField:TextField;
		private var output:TextField;
		
		public function LinkTest()
		{
			super();
			
			// Sprite (コンテナ)
			sprite = new Sprite;
			sprite.addEventListener(MouseEvent.CLICK, sprite_clickHandler);
			sprite.graphics.beginFill(0xEEEEEE);
			sprite.graphics.drawRoundRect(0, 0, 445, 100, 10);
			sprite.graphics.endFill();
			sprite.x = 10;
			sprite.y = 10;
			addChild(sprite);
			
			// Sprite に addChild() するテキストフィールド
			var textFormat:TextFormat = new TextFormat;
			textFormat.font = "Verdana";
			
			textField = new TextField;
			textField.x = 10;
			textField.y = 10;
			textField.width = 425;
			textField.height = 80;
			textField.wordWrap = true;
			textField.multiline = true;

			textField.defaultTextFormat = textFormat;
			textField.htmlText =
				'ほげほげ <a href="event:A"><font color="#003399">リンクAだよ</font></a> ほげほげ ' + "\n" +
				'ほげほげ <a href="event:B"><font color="#003399">リンクBだよ</font></a> ほげほげ ' + "\n" +
				'ほげほげ <a href="event:C"><font color="#003399">リンクCだよ</font></a> ほげほげ ';
			textField.addEventListener(TextEvent.LINK, textField_linkHandler);
			
			sprite.addChild(textField);

			// デバッグ出力用
			output = new TextField;
			output.x = 10;
			output.y = 120;
			output.width = 445;
			output.height = 335;
			output.wordWrap = true;
			output.multiline = true;
			output.border = true;
			output.defaultTextFormat = textFormat;
			output.text = "説明)上のように TextField を内包した Sprite (グレー背景)があります。\n" +
				"「TextField 中のアンカー」以外の場所をクリックした場合は CLICK イベントを処理するけど、アンカーをクリックした場合は " +
				"CLICK イベントを処理したくない。\n" +
				"どうしたらいいんでしょう?\n-----\n";
			addChild(output);
		}

		private function sprite_clickHandler(event:MouseEvent):void
		{
			output.appendText(event.type + "イベント: Sprite をクリックしたよ\n");
		}
		private function textField_linkHandler(event:TextEvent):void
		{
			// このイベントが発生した場合だけ
			// event.stopImmediatePropagation(); とか
			// event.stopPropagation(); で
			// sprite の CLICK イベントを止めたいけど止められない...
			output.appendText(event.type + "イベント: リンク" + event.text + "をクリックしたよ\n");
                        textField.addEventListener(MouseEvent.CLICK, function(e:MouseEvent):void{
                            e.stopImmediatePropagation();
                            textField.removeEventListener( MouseEvent.CLICK, arguments.callee )
                        });
		}
	}
}