12

我需要在 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 开发的新手,所以也许我只是没有以正确的方式思考这个问题。如果有人可以提出另一种方法,我将不胜感激。提前感谢您的意见或建议。

- 詹姆士

4

6 回答 6

18

Adobe 将其作为一种安全措施来确保用户是那些弄乱文件而不是潜在有害代码的人。我的理解是,他们通过仅允许源自 UI 组件的(单击?)事件的处理程序执行 FileReference 方法来强制执行此操作,因此以编程方式生成您自己的事件将不起作用,尽管我没有尝试验证这一点。不幸的是,我发现的最佳解决方案是重新设计 UI 以符合此约束。在您的特定情况下,您可以使用“准备下载”之类的按钮将其设为两次单击过程,该按钮会在 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

这是对 Thomas 回答的评论(我还没有足够的 XP 来评论):mousedownandmouseup解决方法效果很好。请注意,如果您在prepare_PDF()需要“撤消”中进行任何更改save_PDF(),那么在事件上调用该代码也是一个好主意mouseout,因为可能存在用户鼠标按下按钮的情况,但随后移动鼠标远离按钮。

这与我的案例特别相关,当用户单击下载按钮(触发.save()调用)时,我们增加了图像上水印的大小。mousedown我在和mouseout事件上将水印的大小减小到正常值。

于 2011-02-09T12:28:05.103 回答
0

我有同样的问题,我选择使用 flash.net 方法。flash.net.navigateToURL(url);从动作脚本或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 回答