ユーザーがクラウドベースのドキュメントを編集できるようにするFlexアプリケーションがあります。(SlideRocketを考えてみてください。)ユーザーがブラウザウィンドウから移動したり閉じたりしようとしたときに、変更が保存されていない場合は、確実なダイアログを表示したいと思います。
次のカスタムクラスを使用しています。これは、ブラウザのクローズまたはページの変更(as3)で通知されたFlashPlayerで見つかりました。それは問題ではないと思います。
package
{
import flash.external.ExternalInterface;
public class ExternalInterfaceUtil
{
public static function addExternalEventListener(qualifiedEventName:String, callback:Function, callBackAlias:String):void
{
// 1. Expose the callback function via the callBackAlias
ExternalInterface.addCallback( callBackAlias, callback );
// 2. Build javascript to execute
var jsExecuteCallBack:String = "document.getElementsByName('"+ExternalInterface.objectID+"')[0]."+callBackAlias+"()";
var jsBindEvent:String = "function(){"+qualifiedEventName+"= function(){"+jsExecuteCallBack+"};}";
// 3. Execute the composed javascript to perform the binding of the external event to the specified callBack function
ExternalInterface.call(jsBindEvent);
}
}
}
私のapplicationComplete関数では、次のように、イベントリスナーをjavascriptwindow.onbeforeunloadイベントに追加します。
ExternalInterfaceUtil.addExternalEventListener("window.onbeforeunload", requestUnloadConfirmation, "unloadConfirmation");
ユーザーがブラウザウィンドウを閉じようとすると、Actionscript関数requestUnloadConfirmation(下記)が正常に呼び出されます。ただし、ブラウザが閉じるのを妨げることはありません。(Chromeでは、ブラウザーが閉じ、その後Actionscript関数が呼び出されます。Firefoxでは、ブラウザーは関数の実行中は開いたままですが、その後閉じます。)
private function requestUnloadConfirmation():String {
if (changedSinceSave)
return "There are unsaved changes. Are you sure you want to leave without saving?";
else
return null;
}
動作は、デバッグビルドとリリースビルドの両方、および本番サーバーとローカルマシンで同じです。
どんな助けでも大歓迎です、
デイブ