2010
1/12

navigateToURL+IE+wmode:”transparent”の憂鬱

addEventListenerの書き方の定番」や「ステージのインスタンスを自動宣言」と同じような、備忘録を兼ねたas3メモ。

as3で他ページへのリンクを実装する場合、通常はnavigateToURLメソッドが使われます。

package {
	import flash.display.MovieClip;
	import flash.events.MouseEvent;
	import flash.net.navigateToURL;
	import flash.net.URLRequest;

	public class Main extends MovieClip {
		btn.addEventListener(MouseEvent.CLICK, onBtnClick, false, 0, true);
	}

	public var btn:MovieClip;

	public function onBtnClick(e:MouseEvent):void {
		var url:String = "http://www.tonpoo.com/";
		var req:URLRequest = new URLRequest(url);
		navigateToURL(req, "_self");
	}
}


上記はリンク先を同じウィンドウで表示する場合の例。別ウィンドウで表示させる場合は、navigateToURLの行が以下のようになります。

navigateToURL(req, "_blank");

さて、通常であればこれで問題ないのですが、swfファイルをhtml上に埋め込むための設定で、wmodeの値を“transparent”“opaque”にしていた場合、この方法でリンクボタンの設定をすると、IEで実行した時にポップアップブロックの警告が出てしまい、すんなりリンク先を開く事ができなくなります。

※wmode=”window”の場合は問題ないようです。

さてどうするかということで参考になるのが下記の記事。

IEのポップアップブロックのブロック | エントリー | _level0.KAYAC

ExternalInterfaceを使って、JavaScriptのwindow.openを直接実行するわけですね。となると当然、wmode=”transparent”の他に、allowscriptaccess=”always”にする必要が出てきます。

ということで出来たHTML側のテンプレ(swfobject使用):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<title>サンプル</title>
		<meta http-equiv="Content-Script-Type" content="text/javascript;" />
		<script type="text/javascript" src="swfobject.js"></script>
		<script type="text/javascript">
			var flashvars = {};
			var params = {};
			params.wmode = "transparent";
			params.allowscriptaccess = "always";
			var attributes = {};
			swfobject.embedSWF("sample.swf", "myAlternativeContent", "800", "600", "9.0.0", false, flashvars, params, attributes);
		</script>
	</head>
	<body>
		<div id="myAlternativeContent">
			<a href="http://www.adobe.com/go/getflashplayer_jp">
				<img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" />
			</a>
		</div>
	</body>
</html>

SWF側のドキュメントクラスの例:

package {
	import flash.display.MovieClip;
	import flash.events.MouseEvent;
	import flash.external.ExternalInterface;

	public class Main extends MovieClip {
		btn.addEventListener(MouseEvent.CLICK, onBtnClick, false, 0, true);
	}

	public var btn:MovieClip;

	public function onBtnClick(e:MouseEvent):void {
		var url:String = "http://www.tonpoo.com/";
		ExternalInterface.call("window.open",url,"");
	}
}

URLRequestの設定をする必要がない分、navigateToURLを使った場合よりも記述がシンプルになっているのが面白いですね。個人的にはwmode=”transparent”はあまり使いたくない設定なのですが、コンテンツの仕様上使わざるを得ない事も多いので、忘れないでいたいと思います。

Filed under: actionscript3,tips,troublesComments (0)— tonpoo @ 9:36 PM

コメントはまだありません »

コメントはまだありません。

この投稿へのコメントの RSS フィード。 TrackBack URL

コメントする