1

ユーザーがクラウドベースのドキュメントを編集できるようにする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;
}

動作は、デバッグビルドとリリースビルドの両方、および本番サーバーとローカルマシンで同じです。

どんな助けでも大歓迎です、

デイブ

4

3 に答える 3

2

現在、JavaScriptイベントが発生すると、AS3コードで関数を呼び出すように設定されています。ただし、JavaScript関数は、AS3関数が返す値を返しません。この動作を取得するには、次のaddExternalEventListenerように作成されたJavaScriptイベント処理関数に「return」を追加します。

var jsBindEvent:String = "function(){"+qualifiedEventName+"= function(){return "+jsExecuteCallBack+"};}";

イベントハンドラーはtrueまたはfalseの値を返す必要があるため、関数には、イベントをキャンセルするためrequestUnloadConfirmationのreturnタイプBooleanとreturnを指定する必要があります。それ以外の場合は、以下を使用して、確認ダイアログボックスを表示します。falsetrue

private function requestUnloadConfirmation():Boolean {          
    if (changedSinceSave)          
        return ExternalInterface.call("confirm", "There are unsaved changes. Are you sure you want to leave without saving?");
    else          
        return false;          
}

更新: 文字列をwindow.onbeforeunloadに返すと、確認ダイアログボックスが自動的に表示されることがわかりました。確認するExternalInterface.callにより、2番目のダイアログボックスが表示されます。冗長です。AS3コードで必要な唯一の変更は、生成されたJavaScriptに「return」を追加することです。

于 2010-02-24T20:21:48.270 に答える
0

通常のhtml/javascript Webアプリでは、window.onbeforeunloadイベントを使用してこれを行います。

http://www.4guysfromrolla.com/demos/OnBeforeUnloadDemo1.htm

おそらく、このイベントを使用して、フレックスアプリの値をチェックして、ユーザーに質問する必要があるかどうかを判断できます(フレックスに精通していない...)?

于 2010-02-24T09:12:30.140 に答える
0

それを機能させるには、上記のコードにいくつかの変更を加える必要がありました。この問題は、イベントwindow.onbeforeunloadを処理する関数が、ポップアップ確認を回避するために値を返さず、ポップアップ確認が順番に並んでいるときにテキスト値を返す必要があるという事実が原因でした。

これが私の変更です:

private function requestUnloadConfirmation():String {          
             if (changedSinceSave){
                    return "There are unsaved changes. Are you sure you want to leave without saving?";
             } 
            return null;          
        }

そして組み込みJSの少しの変更

var jsBindEvent:String = "function(){"+qualifiedEventName+"= function(){ if ("+jsExecuteCallBack+") return "+jsExecuteCallBack+"};}";
于 2015-05-19T13:30:36.017 に答える