FileReferenceList:强制浏览()对话框保持在最顶层

时间:2010-06-28 17:01:14

标签: actionscript-3 filereferencelist

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

我使用以下简单代码:

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

一个大闪存按钮会触发此代码,完全正常。不幸的是,我没有强制在打开浏览文件的对话框时无法单击该按钮,因此我收到“错误:错误#2041:一次只能执行一个文件浏览会话。”如果我在弹出对话框启动时单击按钮。

我非常喜欢的解决方案是Google Docs的解决方案。在显示弹出对话框时,它不允许您单击“选择要上载的文件”上方的按钮。实际上,此对话框具有一种优先级:在选择文件或在此对话框中取消之前,无法单击页面上的任何内容。

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

任何人都有任何线索吗?

非常感谢,

鲁迪

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

Google文档浏览对话框是“模态”(意味着在对话框启动时焦点无法转到其他任何位置)。据我所知,默认情况下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
}