ブラウザを閉じる時にイベントを発行する

(サンプル一覧を表示する)

ブラウザが閉じられる時にイベントを発行するテストをしてみました。
(注: このサンプルはブラウザによっては期待通りに動かないことがあります。)

ネットワークゲームを作る時、最後にソケットを閉じる処理を実行したり、
いつでも続きから再開できるゲームを作る時に、ゲームの内容を閉じるタイミングに合わせて保存したい
というような時に使えると思います。

ActionScript のコードだけではブラウザ終了時のイベントが取れないようなので、
JavaScript の window.onbeforeunload イベントを使用しています。

JavaScript が無効になっている時やブラウザの強制終了時はこのイベントを取得できないと思うので、
「もし動けば便利」程度の感覚で使用する方が良いと思います。

ブラウザのウインドウを閉じる時以外にも、
「戻るボタン」、「進むボタン」、「更新ボタン」を押した時にも
このイベントが発行されるようです。

このサンプルは実行確認の都合上、MonsterDebugger を使って実行内容を表示しています。
(ブラウザを閉じる時のサンプルなので、ブラウザ上では表示できないですよねw)

De MonsterDebugger - Open Source Flash, Flex and AIR debugger
http://www.demonsterdebugger.com/

MonsterDebugger は AIR アプリ形式の Flash 用デバッガで、
LocalConnection クラスを使ってデバッグ情報をやり取りするようになっています。
このサンプルで使う以外にも、ActionScript コードのデバッグに役立つので
興味のある方はインストールしてみてください。

Flash の実行画面
ブラウザを閉じる時にイベントを発行する

MonsterDebugger の画面に内容を表示しています。
動作確認する時は MonsterDebugger をインストールしてください。

Flash の開始時に "--- Start ---"、
Flash の終了時に "browserClose"
と表示します。

ソースコード

Flash 側のソース
package 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.external.ExternalInterface;
	import flash.system.Security;
	
	import nl.demonsters.debugger.MonsterDebugger;
	
	/**
	 * ブラウザを閉じる時にイベントを発行する
	 * @author Hikipuro
	 */
	public class Main extends Sprite 
	{
		/**
		 * MonsterDebugger 用のオブジェクト
		 */
		private var debugger:MonsterDebugger;
		
		/**
		 * コンストラクタ
		 */
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		/**
		 * 初期化メソッド
		 * @param	e
		 */
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			
			// MonsterDebugger の初期化
			debugger = new MonsterDebugger(this);
			MonsterDebugger.trace(this, "--- Start ---");
			
			// JavaScript から呼び出し可能なメソッドを登録する
			try {
				Security.allowDomain("hikipuro.is-a-geek.org");
				ExternalInterface.addCallback("browserClose", browserClose);
			} catch (e:Error) {
				// Flash 開発環境でデバッグ時に、エラーが起きるのでスルーする
			}
		}
		
		/**
		 * ブラウザを閉じる時に JavaScript から呼び出されるメソッド
		 */
		public function browserClose():void
		{
			MonsterDebugger.trace(this, "browserClose");
		}
	}
}
		

JavaScript 側のソース
<!-- SWF 表示領域。ここの内容は、 swfobject により書き換えられます。 -->
<div id="swf_container">
	<a href="http://www.adobe.com/go/getflashplayer">
		<img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" />
	</a>
</div>

<script type="text/javascript">
<!--
// ブラウザが閉じられる時に呼び出される関数を登録
window.onbeforeunload = function () {
	browserClose();
};

// ブラウザが閉じられる時
function browserClose()
{
	var method = 'browserClose';
	var obj = document.getElementById("swf01");
	if (obj && typeof obj[method] != "undefined") {
		obj[method]();
	}
}
//-->
</script>

<script type="text/javascript">
<!--
// Flash を読み込む swfobject のコード
// allowScriptAccess パラメータを always にし、
// attributes の id と name を設定する。

var flashvars = {};
var params = {};
params.allowScriptAccess = "always";
var attributes = {};
attributes.id = "swf01";
attributes.name = "swf01";
swfobject.embedSWF("BrowserCloseEventTest.swf", "swf_container", "320", "240", "9.0.0", "expressInstall.swf", flashvars, params, attributes);
//-->
</script>		

スタンドアロンの FlashPlayer 上で動かしている時は、ブラウザ終了時のイベントが取れません。
サンプルを実行する時はブラウザ上で、JavaScript のコードも用意した上で確認してください。

追記

Google Chrome で HTML をフレーム表示している時にうまくイベントが発行されないようです。
IE ではフレーム表示してる時にしかイベントが発行されないような感じです。。

window.onbeforeunload 以外のイベントを使うとうまくいくかもしれませんね。
もっと良い方法が分かったら更新します。

リンク