2009
12/22

FlashからExternalInterfaceクラスを使ってLightboxを呼び出す

「Flash(swf)からLightboxを呼び出す」というニーズがこれまでに何回かあり、またついさっきもあって、その都度ちょっと面倒だったりしたのでメモ。なお、ウチの会社ではswfファイルの埋め込みには通常swfobject2を使ってるので、以下は「Lightbox2.04 + swfobject2 + ActionScript(ExternalInterfaceクラス)」という組み合わせが前提となっています。

Lightboxを入手

まず使用するLightboxのバージョンは2.04。Lokesh Dhakar氏によるLightbox 2の公式サイトで入手。

ベースHTMLの作成

次にベースとなるHTMLを作成。今回はとりあえずSWFObject 2 HTML and JavaScript ジェネレーターを使ってサクっと作りました。ポイントとしては、「SWFの定義」のオプションを一部変更すること。
ss1

まず、Lightboxを表示した際に、swfコンテンツが上に来てしまうのを避けるため、wmodeをtransparentに設定。また、ExternalInterfaceクラスを使うので、allowscriptaccessをalwaysに設定。できあがったHTMLは下記の通り:

<!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>

Lightbox用のライブラリを組み込み

上記のベースHTMLのheadセクションに、Lightbox動作のためのjsファイルとcssファイルを組み込む下記の記述を追加。

<script type="text/javascript" src="js/prototype.js"></script>
<script type="text/javascript" src="js/scriptaculous.js?load=effects,builder"></script>
<script type="text/javascript" src="js/lightbox.js"></script>
<link rel="stylesheet" href="css/lightbox.css" type="text/css" media="screen" />

Lightboxを起動させるJavaScriptメソッドを追加

Lightboxを直接起動させるJavaScriptのメソッドがないので、下記ページを参考にそのためのメソッドを追加。

Execute Lightbox Scripts From Flash at Codefidelity
(情報元:Flash から Lightbox を起動する方法 – minorio のプログラミング・メモ

具体的に追加する内容は下記の通り。

<script type="text/javascript">
function LightboxDelegate(url,caption) {
	var objLink = document.createElement('a');
	objLink.setAttribute('href',url);
	objLink.setAttribute('rel','lightbox');
	objLink.setAttribute('title',caption);
	Lightbox.prototype.start(objLink);
}
</script>

最終的にできあがったhtmlは下記の通り。

<!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" src="js/prototype.js"></script>
		<script type="text/javascript" src="js/scriptaculous.js?load=effects,builder"></script>
		<script type="text/javascript" src="js/lightbox.js"></script>
		<link rel="stylesheet" href="css/lightbox.css" type="text/css" media="screen" />
		<script type="text/javascript">
			//swfobject関係
			var flashvars = {};
			var params = {};
			params.wmode = "transparent";
			params.allowscriptaccess = "always";
			var attributes = {};
			swfobject.embedSWF("sample.swf", "myAlternativeContent", "600", "400", "9.0.0", false, flashvars, params, attributes);
			//LightboxDelegate関係
			function LightboxDelegate(url,caption) {
				var objLink = document.createElement('a');
				objLink.setAttribute('href',url);
				objLink.setAttribute('rel','lightbox');
				objLink.setAttribute('title',caption);
				Lightbox.prototype.start(objLink);
			}
		</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>

ExternalInterfaceで呼び出し

次はFlash側の用意。sample.flaというファイル(ActionScript3)を用意、ステージ上にボタン用のMovieClipインスタンスを3つ配置し、それぞれbtn0, btn1, btn2という名前を付ける。sample.flaのドキュメントクラスとしてSampleクラスを指定。Sample.asの内容は下記の通り。

package {
	import flash.display.MovieClip;
	import flash.events.MouseEvent;
	import flash.external.ExternalInterface;
	
	public class Sample extends MovieClip{
		public function Sample() {
			//Lightbox用の設定
			lightboxArray = new Array();
			lightboxArray[0] = {
				src:"images/photo0.jpg",
				caption:"写真その0"
			};
			lightboxArray[1] = {
				src:"images/photo1.jpg",
				caption:"写真その1"
			};
			lightboxArray[2] = {
				src:"images/photo2.jpg",
				caption:"写真その2"
			};
			//ボタンの設定
			for (var i:uint = 0; i < 3; i++) {
				var btn:MovieClip = this["btn" + i];
				btn.id = i;
				btn.buttonMode = true;
				btn.addEventListener(MouseEvent.CLICK, onBtnClick, false, 0, true);
			}
		}
		
		public var lightboxArray:Array;
		public var btn0:MovieClip;
		public var btn1:MovieClip;
		public var btn2:MovieClip;
		
		//ボタン用メソッド
		public function onBtnClick(e:MouseEvent):void {
			var btn:MovieClip = e.target as MovieClip;
			var id:uint = btn.id;
			var src:String = lightboxArray[id].src;
			var caption:String = lightboxArray[id].caption;
			//LightboxDelegateメソッドを呼び出し
			ExternalInterface.call("LightboxDelegate",src,caption );
		}
	}
}

これで完成!

オマケ:IE7~8でのLightboxの表示バグフィックス

Lightboxを使った縦に長いページをIEで閲覧した場合、ページをスクロールしてからLightboxを起動すると、Lightboxの背景(黒い透過)部分が途中で切れてしまう。これを回避するためにとりあえずやったのがlightbox.cssの改造。具体的には#overlayのpositionをabsoluteからfixに変更(+IE6ではおかしくなってしまうので、スターハックを使ってabsoluteのまま)部分を下記のようにしました。

#overlay {
	position: fixed;
	top: 0;
	left: 0;
	z-index: 90;
	width: 100%;
	height: 500px;
	background-color: #000;
}
* html #overlay {
	position: absolute;
}

以上、備忘録もかねて参考までに。

Filed under: ActionScript2,ActionScript3,SWFObject,TipsComments (3)— tonpoo @ 10:55 PM

3件のコメント »

  1. [...] http://www.tonpoo.com/blog/2009/12/flash-externalinterface-lightbox/ http://memo.kappa-lab.com/2009/05/flash_lightboxjs.html [...]

    ピンバック by LightBoxとFlashをうまく使う方法 « sakaiden — 2010年6月18日 @ 3:10 AM

  2. lightbox2を使用しているんですが、黒背景がページ下まで伸びずに、途中で切れてしまう、という現象に悩んでおりました。(↓この人みたいに)http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1153977086

    途中のfloatが原因なのか、jsを他にも多数使用しているのが原因なのか、分かりかねていたところ、遂にこちらのページのオマケで解決しました!
    ありがとうございます!

    Comment by まつもと — 2012年2月22日 @ 12:35 PM

  3. まつもとさん

    コメントありがとうございましたー。
    お役に立ててよかったです!

    Comment by tonpoo — 2012年2月22日 @ 12:40 PM

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

コメントする