FileReferenceList: заставить диалоговое окно browse () оставаться сверху - PullRequest
1 голос
/ 28 июня 2010

Вероятно, это будет простой вопрос, но я не могу найти свой ответ в Интернете после поиска.

Я использую следующий простой код:

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

Большая кнопка вспышки запускает этот код, который прекрасно работает. К сожалению, я не требую, чтобы кнопка не могла быть нажата, пока открыто диалоговое окно для просмотра файла, поэтому я получаю сообщение «Ошибка: Ошибка № 2041: одновременно может быть выполнен только один сеанс просмотра файла». если я нажму на кнопку во время всплывающего диалогового окна.

Мне действительно нравится решение, которое есть в Документах Google. Он не позволяет нажимать на их кнопку над «Выбрать файлы для загрузки», пока отображается всплывающее диалоговое окно. На самом деле, это диалоговое окно имеет своего рода приоритет: вы не можете щелкнуть ЛЮБОЕ на странице, прежде чем выбрать файлы или отменить в этом диалоговом окне.

Мне бы хотелось, чтобы у меня было такое же поведение, чтобы пользователи не нажимали нигде на моей веб-странице до тех пор, пока это диалоговое окно не будет создано, точно так же, как это делает Документы Google, но я не могу найти, как это сделать.

Любая подсказка от кого-нибудь, пожалуйста?

Большое спасибо,

Rudy

Ответы [ 2 ]

1 голос
/ 30 октября 2012

Вы должны взглянуть на файл HTML, в который встроен SWF.В Windows / Firefox поведение диалогового окна «выбрать файл» будет отличаться в зависимости от того, какой режим окна (wmode) вы используете в теге EMBED на странице HTML.

Если вы используете wmode = "opaque" илиwmode = "transparent", тогда диалог выбора файла не будет модальным, и вы сможете щелкнуть само окно браузера, чтобы вывести его на передний план.(Также вы сможете свернуть и даже окно браузера).Это, кажется, относится только к Windows / Firefox;все другие браузеры, кажется, поддерживают диалоговое окно «Выбрать файл» сверху.

Если вы пропустите атрибут wmode (по умолчанию это «окно») или установите его в «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>
0 голосов
/ 28 июня 2010

Диалог просмотра 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
}
...