FileReferenceList: заставить диалоговое окно browse() оставаться на вершине
Вероятно, это будет простой вопрос, но я не могу найти свой ответ в Интернете после поиска.
Я использую следующий простой код:
var fileReferenceList:FileReferenceList = new FileReferenceList();
fileReferenceList.addEventListener(Event.SELECT, onSelect);
fileReferenceList.browse();
Большая кнопка вспышки запускает этот код, который прекрасно работает. К сожалению, я не требую, чтобы кнопка не могла быть нажата, когда открыто диалоговое окно для просмотра файла, поэтому я получаю сообщение "Ошибка: Ошибка № 2041: одновременно может выполняться только один сеанс просмотра файла". если я нажму на кнопку, когда всплывающее диалоговое окно вверх.
Мне действительно нравится решение, которое есть в Документах Google. Он не позволяет нажимать на их кнопку над "Выбрать файлы для загрузки", пока отображается всплывающее диалоговое окно. На самом деле, это диалоговое окно имеет своего рода приоритет: вы не можете щелкнуть ЛЮБОЕ на странице, прежде чем выбрать файлы или отменить в этом диалоговом окне.
Я хотел бы иметь такое же поведение, чтобы пользователи не нажимали в любом месте моей веб-страницы до тех пор, пока это диалоговое окно не будет создано, как это делает Документы Google, но я не могу найти, как это сделать.
Любая подсказка от кого-нибудь, пожалуйста?
Большое спасибо,
Rudy
2 ответа
Вы должны взглянуть на файл 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>
Диалоговое окно просмотра Документов 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
}