簡體   English   中英

Flex的FileReference.save()只能在用戶事件處理程序中調用 - 我該如何解決這個問題?

[英]Flex's FileReference.save() can only be called in a user event handler — how can I get around this?

我需要在Web服務調用完成后調用FileReference.save(),但此方法有一個限制:“在Flash Player中,您只能成功調用此方法以響應用戶事件(例如,在事件處理程序中)用於鼠標單擊或按鍵事件。)否則,調用此方法會導致Flash Player拋出錯誤異常。“ (來自此處的文檔)

這種限制有點模糊。 這是否意味着我只能從事件處理函數中調用FileReference.save()方法,該函數被注冊為某些類型的用戶事件的偵聽器? 如果是,那么究竟哪些用戶事件有效? (也許有一個事件永遠不會被用戶與我的應用程序交互調度,我可以為該事件類型注冊事件處理函數並從該函數中調用save()?)

我的困難是我無法安全地調用FileReference.save()方法,直到我的Web服務返回將用作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()調用的第二個鼠標單擊事件處理函數,並在超時間隔后調用它(以便讓Web服務時間完成),但我保留了遇到同樣的錯誤 - 也許這種方法不起作用,因為第二個函數沒有注冊為用作其參數的事件類型的事件監聽器。

我是Flex開發的新手,所以也許我只是沒有以正確的方式思考這個問題。 如果有人可以提出另一種方法,我會非常感激。 提前感謝您的意見或建議。

- 詹姆士

Adobe將此作為一種安全措施,以確保用戶是那些搞亂文件而不是潛在有害代碼的人。 我的理解是,他們通過僅允許源自UI組件的(click?)事件的處理程序來執行此操作來執行FileReference方法,因此以編程方式生成您自己的事件將無法工作,盡管我還沒有嘗試驗證這一點。 不幸的是,我發現的最佳解決方案是重新使用UI以符合此約束。 在您的特定情況下,您可以使用一個類似“准備下載”的按鈕進行雙擊處理,該按鈕在Web服務完成后更改為“下載文件”。 從用戶的角度來看,這不太理想,但我認為除非您能夠在顯示觸發FileReference.save()調用的按鈕之前以某種方式完成Web服務調用,否則還有很多其他事情可以完成。

經過努力奮斗,幾個小時后我找到了一個解決方法:你可以同時使用mouseDown和mouseUp事件而不是單擊。

例如:s:Button mouseDown =“prepare_PDF()”mouseUp =“save_PDF()”

對我來說工作正常!

快樂的編碼!

- 托馬斯

作為一種解決方法,我使用了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。

我有同樣的問題,我選擇使用flash.net方法。 調用flash.net.navigateToURL(url); 來自actionscript或navigateToURL(url); 來自mxml。

我要解決這個問題是顯示一個匿名函數的警報消息,所以我不必創建一個按鈕。

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);

這是對托馬斯回答的評論(我還沒有足夠的評論來評論): mousedownmouseup解決方法效果很好。 請注意,如果你在prepare_PDF()中進行任何需要在save_PDF() “撤消”的save_PDF() ,那么最好在mouseout事件上調用該代碼,因為可能存在用戶mousedown on的情況。按鈕,但然后將鼠標移離按鈕。

這與我的情況特別相關,當用戶點擊下載按鈕(觸發.save()調用時),我們會增加圖像上水印的大小。 我在mousedownmouseout事件上將水印的大小減小到正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM