3

Flex クライアント アプリケーションがあります。ユーザーがブラウザーを閉じたときに Flex で実行するクリーンアップ機能が必要です。ネットで次の解決策を見つけましたが、途中でしか機能しません。どうすれば修正できますか?ご回答ありがとうございます。

症状

  • CustomEventトリガーされますが、実行されません。
    >> EventHandler forCustomEvent.SEND_EVENTSは Mate EventMap によって定義されます。ハンドラーが行うのは、 を呼び出すことだけHTTPServiceInvokerです。デバッグ コンソールで、ハンドラーと HTTPServiceInvoker がトリガーされていることを確認できますが、resultHandlersも もfaultHandlers呼び出されませんでした。ボタンクリックハンドラで同じものをディスパッチするとCustomEvent.SEND_EVENTS、期待どおりに動作するため、このイベントハンドラに問題がないことはわかっています)
  • ブラウザは、閉じる前にクリーンアップ機能が完了するのを待っているようです。(ブラウザが閉じる前にすべてのトレースが出力されました)

コード

以下を index.template.html に追加しました

window.onbeforeunload = clean_up;

function clean_up()
{
 var flex = document.${application} || window.${application};
 flex.cleanUp();
}

そして、アプリケーションの MXML ファイルで以下を使用しました

import flash.external.ExternalInterface;

public function init():void {
ExternalInterface.addCallback("cleanUp",cleanUp);
}

public function cleanUp():void {   

   var newEvent:CustomEvent = new CustomEvent(CustomEvent.SEND_EVENTS);
   newEvent.requestObj = myFormModel;

   dispatchEvent(newEvent);

   // for testing purposes
   // to see whether the browser waits for Flex cleanup to finish before closing down   
   var i:int;
   for (i=0; i<10000; i++){
        trace(i);
   }    

}

マイセットアップ

  • フレックスビルダー 3
  • Mate MVC フレームワーク (Mate_08_9.swc)
  • フラッシュプレーヤー 10
4

3 に答える 3

2

残念ながら、非同期で実行されるこのようなクリーンアップ関数を実行する確実な方法はありません。HTTPServiceのresult/イベントは、メソッドが返された後に非同期で発生します。ブラウザーは、関数 (js clean_up関数) が戻るまで待機します。その関数から呼び出さない限り、ページは閉じられます。preventDefault()を呼び出すと、OK/キャンセルのポップアップが表示されることに注意してください。faultcleanUponbeforeunloadevent.preventDefault()

このページから移動してもよろしいですか?

[OK] を押して続行するか、[キャンセル] を押して現在のページにとどまります。

ユーザーが [OK] を選択しても、ブラウザーは閉じられます。このプロパティを使用しevent.returnValueて、popop にカスタム メッセージを追加できます。

//tested only in Firefox
window.addEventListener("beforeunload", onUnload, false);
function onUnload(e)
{
   e.returnValue = "Some text that you want inserted between " +
     "'Are you sure' and 'Press OK' lines";
   e.preventDefault();
}
于 2009-10-30T05:30:50.367 に答える
1

100% の確率でブラウザー コードを確実に検出することはできません。本当にアクションを実行する必要がある場合、最も安全なアクションは、クライアントに「私はまだ生きています」というメッセージをサーバーに送信させることです。サーバーは、クライアントごとに時間を追跡する必要があり、クライアントが指定された時間内にメッセージを送信しなかった場合 (多少の余裕はあります)、クリーンアップ アクティビティを実行する必要があります。

時間を長くすればするほど、クリーンアップの時間がどれほど重要かによって異なります。5 分間待つだけで済む場合は問題ありませんが、それ以外の場合は、アプリに必要な 1 分または 30 秒を見てください。

于 2009-10-30T16:45:43.513 に答える
1

クライアント側でセッションをクリーンアップする別の方法はexternal.interface、as3 で JavaScript とクラスを使用することです。サンプルコードは次のとおりです。

JavaScript:

function cleanUp()
{

    var process;
    var swfID="customRightClick";
    if(navigator.appName.indexOf("Microsoft") != -1){
        process = window[swfID];
        }else
    {
        process = document[swfID];
    }
    process.cleanUp();
}

クリーンアップ関数が定義されている as3 クラスでは、これを使用します。

import flash.external.ExternalInterface;

if (ExternalInterface.available)
{
    ExternalInterface.addCallback("cleanUp", cleanUp);
}

function cleanUp():void {// your code }
于 2009-11-02T10:18:28.240 に答える