Flash крадет фокус браузера - PullRequest
       6

Flash крадет фокус браузера

17 голосов
/ 31 октября 2008

На моей странице есть приложение flash, и когда пользователь взаимодействует с приложением flash, браузер / html / javascript прекращает получать ввод с клавиатуры.

Например, в Firefox control-t больше не открывается новая вкладка.

Однако, если я нажму на часть страницы, которая не мигает, браузер снова начнет получать эти события.

Есть ли способ программно (либо через flash, либо через javascript) вернуть фокус в браузер?

После того, как пользователь нажимает кнопку во флэш-памяти, у меня есть флэш-память, выполняющая обратный вызов javascript, поэтому я попытался выделить фокус на поле формы (и на тело) с помощью javascript, но этот подход, кажется, работа.

Возможно, более конкретный пример - Youtube. У них тоже есть эта проблема. Когда я нажимаю кнопку воспроизведения / паузы или регулирую громкость, я ожидаю, что элементы управления клавиатуры моего браузера все еще работают, но они этого не делают, я должен щелкнуть где-нибудь на странице за пределами области фильма. Это именно та проблема, которую я пытаюсь решить.

Ответы [ 6 ]

6 голосов
/ 31 октября 2008

Вы можете использовать класс ExternalInterface во Flash для вызова JavaScript. Например, вы можете установить функцию на интервале (например, Event.ENTER_FRAME) для вызова функции JavaScript, о которой упоминал @Diodeus:

document.body.focus();

Или, еще лучшим решением было бы добавить прослушиватель событий в корень флэш-памяти (stage) для прослушивания, когда мышь покидает Flash. Вы можете настроить это событие, чтобы переместить фокус на document.body.

AS3

package {
   import flash.display.*;
   import flash.events.*;
   import flash.external.ExternalInterface;

    public class TestMouseLeave extends Sprite
    {
        public function TestMouseLeave()
        {
            // Add event listener for when the mouse LEAVES FLASH
            addEventListener(MouseEvent.MOUSE_OUT, onMouseLeave);
        }

        private function onMouseLeave(ev:Event):void
        {
            var jslink = new ExternalInterface();
            jslink.call("changeFocus");
        }
    }

}

Javascript на вашей странице:

<script type="text/javascript" language="javascript">
    function changeFocus(){
        document.body.focus();
    }
</script>

Дайте мне знать, если вам нужен пример AS2, и я опубликую его.

Хотел бы отметить это решение: как только вы вернете фокус обратно в браузер, вам потребуется, чтобы пользователь снова щелкнул по плагину Flash, чтобы активировать пользовательский ввод внутри плагина Flash. Это может вызвать у пользователя неприятные ощущения, и его следует учитывать при использовании этого решения.

3 голосов
/ 31 октября 2008

Я думаю, что Adobe нужно убрать фокус, когда мышь выходит из своей клиентской области, или предоставить возможность сделать это.

Однако я думаю, что большинство разработчиков Flash (и особенно те, кто делают игры) полагаются на тот факт, что ввод с клавиатуры воспринимается приложением flash независимо от того, где находится мышь.

2 голосов
/ 30 декабря 2010

В Firefox document.body.focus(); не работает. Используя ту же идею, что и решение Cláudio Silva для этой проблемы Chrome , в Firefox будет работать следующий JavaScript:

document.body.tabIndex = 0;
document.body.focus();
0 голосов
/ 27 января 2011

Ниже приведено решение на случай, если оно кому-нибудь понадобится. Для меня это работает довольно хорошо. Я могу щелкнуть мышью вокруг своей Flash, но все еще использовать все функциональные возможности клавиатуры браузера (при щелчке внутри Flash фокус смещается на HTML-часть).

http://forums.adobe.com/message/3431403#3431403

0 голосов
/ 18 марта 2009
    <?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init();">
    <mx:Script>
        <![CDATA[
            private function init():void {
                i.setFocus();
                this.addEventListener(KeyboardEvent.KEY_UP,keyPressed);
            }

            private function keyPressed(event:KeyboardEvent):void {
                if(event.keyCode.toString()=="84" && event.ctrlKey==true)
                    ExternalInterface.call('newtab');
            }

        ]]>
    </mx:Script>
    <mx:TextInput x="23" y="268" width="256" id="i" text="Text Box"/>
</mx:Application>

<script type="text/javascript">
function newtab(e){
    document.body.focus();
    window.open('about:blank');
}
</script>    

Теперь, что происходит с другими клавиатурами? 84 стандарт для Т? Мне нравится идея фокусировки, но в полнофункциональных браузерных приложениях не так много места, чтобы потерять фокус. Пользователь также может изменить ключевую комбинацию, я не думаю, что это большая часть исправления для этого без флэш-опроса конфигурации команды из браузера и последующего прослушивания комбо, как мы здесь делаем. Я не знаю.

Это также просто попытка открыть новое окно после выделения фокуса, для меня нет смысла заставлять пользователя нажимать его дважды, если они не блокируют окно как всплывающее окно. Но фокус называется первым, поэтому, если это произойдет, вторая попытка должна сработать. При необходимости вы можете предупредить пользователя в приложении браузера.

0 голосов
/ 31 октября 2008

Вы можете вернуть фокус в браузер, выполнив geturl can, вызвав javascript на странице HTML:

document.body.focus()

То, как вы это сделаете в своем Flash-фильме, будет зависеть от того, как работает взаимодействие пользователя с фильмом. Вы можете продолжать делать это по таймеру, или когда элемент управления теряет фокус, или когда мышь перемещается. Это зависит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...