Подтвердить что ты не робот

Вспышка крадет фокус браузера

У меня есть флеш-приложение на моей странице, и когда пользователь взаимодействует с флеш-приложением, браузер /html/javascript перестает получать ввод с клавиатуры.

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

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

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

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

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

4b9b3361

Ответ 1

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

document.body.focus();

Или еще лучшим решением было бы добавить прослушиватель событий к корню (ступени) флэш-памяти, чтобы слушать, когда мышь покидает 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, и я опубликую его.

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

Ответ 2

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

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

Ответ 3

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

document.body.tabIndex = 0;
document.body.focus();

Ответ 4

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

document.body.focus()

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

Ответ 5

    <?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 стандартных для T? Мне нравится идея фокуса, но в полнофункциональных приложениях браузера не так много места, чтобы потерять фокус. Пользователь также может изменить комбинацию клавиш, я не думаю, что это очень полное исправление для этого без флэш-опроса конфигурации команд из браузера, а затем прослушивания комбо, поскольку мы в основном здесь делаем. Я не знаю.

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

Ответ 6

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

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