Javascript 模拟用户事件

Javascript 模拟用户事件,javascript,events,actionscript,flash,filereference,Javascript,Events,Actionscript,Flash,Filereference,我有一个带有文件swf和HTML按钮的网页:当我单击要保存(下载到磁盘)的按钮时,我的swf文件显示的当前图像(它是一种图像库) 当按钮在我的swf中时,它可以完美地工作,但当我通过ExternalInterface从JavaScript调用保存图像的方法时,它就失败了 我验证了JS-AS通信(没问题),我知道FileReference.save()只有在用户事件触发时才起作用单击HTML按钮可能不被视为用户事件 除了更改任何内容(例如,在服务器端移动一些代码,将图像发送到服务器,然后下载……)

我有一个带有文件swf和HTML按钮的网页:当我单击要保存(下载到磁盘)的按钮时,我的swf文件显示的当前图像(它是一种图像库)

当按钮在我的swf中时,它可以完美地工作,但当我通过ExternalInterface从JavaScript调用保存图像的方法时,它就失败了

我验证了JS-AS通信(没问题),我知道
FileReference.save()
只有在用户事件触发时才起作用单击HTML按钮可能不被视为用户事件

除了更改任何内容(例如,在服务器端移动一些代码,将图像发送到服务器,然后下载……),还有什么方法可以模拟用户事件吗?任何其他解决方案或提示都将不胜感激

注意:我会使用Flash按钮,但HTML是必需的。

解决方案(或不视情况而定) 基于闪存的

目前我想说的是,你最好的选择是坚持用闪光灯内的按钮操作。如果您需要将按钮从主Flash运行时中移开,您可以尝试使用两个嵌入的Flash进行操作,并使用
LocalConnection
在它们之间进行通信。但是,我不建议这样做,因为
LocalConnection
要想正常工作是一件痛苦的事情,而且不能保证在两个实例之间工作时不会遇到安全沙箱问题

基于服务器端的

您可以实现一个存储系统,该系统包括将图像数据发送回服务器,并形成前端可以请求的实际URL。这将允许您指定下载所需的任何内容。这样做的缺点是,它需要一个服务器(因此不能用于离线应用程序),它还需要相当多的麻烦,只需通过一种方式发送图像数据,然后再将其拉下来

我在这里详细介绍了这一点:

基于HTML5的

目前,我不推荐像我在评论中建议的那样下载数据URL,因为它还不是一个完整的解决方案。然而,从好的方面来说,我会密切关注顶级浏览器正在实现什么,因为答案很快就会改变

工作方式 基本上,我只是尝试通过数据URI实现图像下载(认为这将是解决您的问题的最佳解决方案),这一切都很好,而且您可以很高兴地从BitmapData对象派生出所需的Base64数据。但是,问题是无法在下载时指定文件名。因此,您最终得到的文件名相当难看,甚至没有正确的扩展名

<a href="data:image/octet-stream;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC">Click to Download File</a>

经过一点研究,似乎没有可行的解决办法,但有一些规范已经准备好实施,这将有助于:

<a download="filename.png" href="data:image/octet-stream;...">Download File</a>

download属性正是为我上面提到的问题而设计的,它允许对下载进行命名。不幸的是,我还找不到实现它的浏览器

工具书类

你将与不同的安全模型作战,Flash可能只考虑用户事件作为用户在闪存窗口内触发的东西。否则它只是一个来自外部的函数调用,由于安全原因会被阻止。您当前设置的唯一选项是在flash imo中使用该按钮。另一个选项是使用类似的方式实现javascript等价物(通过数据url或服务器下载保存图像)@pebbl您得出了相同的结论,我发布这个问题是为了找到一个不同的解决方案的最后一次尝试…当然,为了给出更详细的回答,但是需要更多的信息来确切地说明服务器/闪存如何存储和公开您的图像。以及您对图像下载的确切期望。我假设通过FileRef.save()路径,您希望用户可以通过一个对话框来选择保存位置?@pebbl是的,我有一个对话框。这些图像已经被第三方合并到swf中(每帧一个图像),我将整个阶段保存到BitmapData对象中,用JPEG编码器压缩,然后调用FileReference。