12

Webサービスの呼び出しが完了した後にFileReference.save()を呼び出す必要がありますが、このメソッドには制限があります。「Flash Playerでは、このメソッドはユーザーイベント(たとえば、イベントハンドラー)に応答してのみ正常に呼び出すことができます。マウスクリックまたはキープレスイベントの場合)。それ以外の場合、このメソッドを呼び出すと、FlashPlayerがエラー例外をスローします。」(ここのドキュメントから)

この制限は少しあいまいです。特定の種類のユーザーイベントのリスナーとして登録されているイベントハンドラー関数内からのみFileReference.save()メソッドを呼び出すことができるということですか?もしそうなら、正確にどのユーザーイベントが有効ですか?(おそらく、ユーザーがアプリケーションを操作してもディスパッチされないイベントがあり、そのイベントタイプのイベントハンドラー関数を登録して、その関数内からsave()呼び出しを行うことができますか?)

私の難しさは、WebサービスがFileReference.save()メソッド呼び出しの引数として使用されるデータを返すまでFileReference.save()メソッドを安全に呼び出すことができないため、FileReferenceをトリガーするイベントです。 save()呼び出しは、実際にはユーザーイベントではなくResultEventであり、FileReference.save()呼び出しをトリガーできるようにするために、新しい(偽の)ユーザーイベントタイプをディスパッチするのは嫌です。私のアプリケーションとの実際のユーザーインタラクションの結果としてディスパッチされることはありません。

一言で言えば、私が今していることはこれです:私はボタンクリックのハンドラーとして登録されている関数を持っています。この関数では、サーバーからデータをフェッチするためにWebサービスを呼び出します。また、Webサービスの呼び出しが完了すると呼び出される結果ハンドラー関数があります。この時点で、データを保存する準備ができていることがわかっているので、FileReference.save()メソッドを呼び出します。ファイル。しかし、前述の制限により、これを行うことができません。エラーが発生します。

Error #2176: Certain actions, such as those that display a pop-up window, 
may only be invoked upon user interaction, for example by a mouse click 
or button press.

FileReference.save()呼び出しを使用して2番目のマウスクリックイベントハンドラー関数を作成し、タイムアウト間隔の後に呼び出す(Webサービスが完了するまでの時間を与える)など、これを回避するために多くのことを試みましたが、同じエラーが発生します。2番目の関数が引数として使用されるイベントタイプのイベントリスナーとして登録されていないため、このアプローチは機能しない可能性があります。

私はFlex開発に不慣れなので、おそらくこれについて正しい方法で考えていません。誰かが別のアプローチを提案することができれば、私はそれを本当に感謝します。コメントや提案を事前に感謝します。

-ジェームズ

4

6 に答える 6

18

アドビはこれを一種のセキュリティ対策として行い、潜在的に有害なコードではなく、ユーザーがファイルをいじり回していることを確認します。私の理解では、UIコンポーネントから発生する(クリック?)イベントのハンドラーのみがFileReferenceメソッドを実行できるようにすることでこれを強制するため、これを検証しようとはしていませんが、プログラムで独自のイベントを生成することはできません。残念ながら、私が見つけた最善の解決策は、この制約に準拠するようにUIを少し作り直すことです。特定の状況では、「ダウンロードの準備」のようなボタンを使用して、これを2クリックのプロセスにすることができます。このボタンは、Webサービスの完了後に「ファイルのダウンロード」に変わります。これはユーザーの観点からは理想的とは言えませんが、

于 2010-07-21T17:42:54.567 に答える
4

そのために苦労した後、数時間、回避策を見つけました。クリックするだけでなく、mouseDownイベントとmouseUpイベントの両方を使用できます。

例:s:Button mouseDown = "prepare_PDF()" mouseUp = "save_PDF()"

私にとってはうまくいきます!

ハッピーコーディング!

-トーマス

于 2010-12-19T17:20:39.777 に答える
2

回避策として、ExternalInterfaceクラスを使用しました。このコードでJavaScript関数を作成しました

function downloadFile (url) {
            window.open(url);
        }

AS3では私は

var url = 'www.example.com/downloadfile.php?file_id=xxx';
ExternalInterface.call('downloadAttachmentFile', url);

それで、ファイル処理をJS/HTMLに転送します。

于 2012-11-12T18:11:49.257 に答える
0

mousedownこれはトーマスの答えに対するコメントです(コメントするのに十分なXPがまだありません):mouseup回避策はうまく機能します。prepare_PDF()で「元に戻す」必要がある変更を加えた場合save_PDF()は、イベントでそのコードを呼び出すことをお勧めしますmouseout。ユーザーがボタンをマウスダウンした後、ボタンから離れたマウス。

.save()これは、ユーザーがダウンロードボタン(呼び出しをトリガーする)をクリックしたときに画像の透かしのサイズを大きくする私の場合に特に関係がありました。mousedownおよびイベントで透かしのサイズを通常のサイズに縮小しmouseoutます。

于 2011-02-09T12:28:05.103 に答える
0

これと同じ問題があり、flash.netメソッドを使用することにしました。flash.net.navigateToURL(url);actionscriptまたはnavigateToURL(url);mxmlから呼び出します。

于 2013-06-14T20:17:28.707 に答える
0

これを解決するために私が行うことは、匿名関数を使用してアラートメッセージを表示することです。これにより、ボタンを作成する必要がなくなります。

Alert.show("Do you wish to download the file?", "Confirm", Alert.OK | Alert.CANCEL, this, function (eventObj:CloseEvent):void {
                                                                                                    if (eventObj.detail == Alert.OK) {
                                                                                                        fileReference.save(zipOut.byteArray, dateFormater_titulo.format(new Date ()) + ".zip");
                                                                                                    }//if
                                                                                                 }/*function*/, null, Alert.OK);
于 2016-12-19T18:07:19.493 に答える