Вспышка крадет фокус браузера
У меня есть флеш-приложение на моей странице, и когда пользователь взаимодействует с флеш-приложением, браузер /html/javascript перестает получать ввод с клавиатуры.
Например, в Firefox control-t больше не открывается новая вкладка.
Однако, если я нажму на часть страницы, которая не является флэш-памятью, браузер снова начнет получать эти события.
Есть ли в любом случае программно (либо через flash, либо javascript), чтобы вернуть фокус в браузер?
После того, как пользователь нажимает кнопку во флэш-памяти, у меня есть флэш, выполняющий обратный вызов javascript, поэтому я попытался сосредоточиться на поле формы (и на теле) через javascript, но этот подход не кажется работа.
Возможно, более конкретным примером является Youtube. У них также есть эта проблема. Когда я нажимаю кнопку воспроизведения/паузы или регулирую громкость, я бы ожидал, что мои элементы управления на клавиатуре браузера все еще будут работать, но они этого не делают, я должен щелкнуть где-нибудь на странице за пределами области фильма. Это точная проблема, которую я пытаюсь решить.
Ответы
Ответ 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