1

这可能是一个简单的问题,但搜索后我似乎无法在网上找到我的答案。

我正在使用以下简单代码:

var fileReferenceList:FileReferenceList = new FileReferenceList();
fileReferenceList.addEventListener(Event.SELECT, onSelect);
fileReferenceList.browse();

一个大的闪光按钮触发了这个代码,它工作得很好。不幸的是,我没有强制在打开浏览文件的对话框时不能单击按钮,所以我得到“错误:错误 #2041:一次只能执行一个文件浏览会话。” 如果我在弹出对话框出现时单击按钮。

我真正喜欢的一个解决方案是 Google Docs 提供的解决方案。在显示弹出对话框时,它不允许您单击“选择要上传的文件”上方的按钮。实际上,此对话框具有某种优先级:在选择文件或取消此对话框之前,您不能在页面上单击任何位置。

我希望有同样的行为,在这个对话框完成之前,不要让用户点击我网页中的任何地方,就像 Google Docs 那样,但我似乎无法找到方法。

请任何人提供任何线索?

非常感谢,

鲁迪

4

2 回答 2

1

您应该查看嵌入 SWF 的 HTML 文件。在 Windows/Firefox 中,“选择文件”对话框的行为会有所不同,具体取决于您在 HTML 页面的 EMBED 标记中使用的窗口模式 (wmode)。

如果您使用 wmode="opaque" 或 wmode="transparent",则“选择文件”对话框将不是模态的,您可以单击浏览器窗口本身将其置于前台。(此外,您将能够最小化甚至浏览器窗口)。这似乎只适用于 Windows/Firefox;其他浏览器似乎都将“选择文件”对话框保持在顶部。

如果省略 wmode 属性(默认为“window”),或将其设置为“direct”或“gpu”,则“选择文件”对话框将是模态的。

模态“选择文件”对话框:

<embed src="Upload.swf" 
       wmode="window"
       quality="best" 
       scale="noscale" 
       swliveconnect="true" 
       salign="lt" 
       width="220" height="75" bgcolor="#ffffff" 
       type="application/x-shockwave-flash" 
       pluginspage="http://www.macromedia.com/go/getflashplayer"></embed>

非模态“选择文件”对话框:

<embed src="Upload.swf" 
       wmode="opaque"
       quality="best" 
       scale="noscale" 
       swliveconnect="true" 
       salign="lt" 
       width="220" height="75" bgcolor="#ffffff" 
       type="application/x-shockwave-flash" 
       pluginspage="http://www.macromedia.com/go/getflashplayer"></embed>
于 2012-10-30T00:17:44.067 回答
0

Google Docs 浏览对话框是“模态的”(意味着在对话框启动时焦点不能转到其他任何内容)。据我所知,FileReference 对话框默认应该是模态的。你在什么浏览器上测试这个?

作为一种解决方法,您可以在对话框启动时在整个舞台上放置一个透明(或半透明,用于调光效果)覆盖。这不会阻止焦点更改,但会阻止单击舞台上的其他按钮。例如这样的类:

public class Overlay extends Sprite
{
    private static const BACKGROUND_OPACITY:Number = 0.40;

    public function Overlay(_stage:Stage)
    {
        graphics.beginFill(0x000000, BACKGROUND_OPACITY);
        graphics.drawRect(0, 0, _stage.stageWidth, _stage.stageHeight);
        graphics.endFill();
    }
}

这将像这样使用(来自文档类):

private var overlay:Overlay;

public function onButtonClick(e:MouseEvent):void
{
    overlay = new Overlay(stage);
    stage.addChild(overlay);

    // ...

    fileReference.browse();

    // ...
}


public function onSelect(e:Event):void
{
    stage.removeChild(overlay);     // Also do this on cancel, and on errors
}
于 2010-06-28T17:21:57.017 回答