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



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я думаю, что Adobe нужно сбрасывать фокус, когда мышь выходит за пределы клиентской области, или предоставить возможность сделать это.
Однако я думаю, что большинство разработчиков Flash (и особенно тех, кто делает игры) полагаются на тот факт, что ввод с клавиатуры улавливается флэш-приложением независимо от того, где находится мышь.
Вы можете вернуть фокус браузеру, выполнив geturl can, вызывая javascript на HTML-странице:
document.body.focus()
То, как вы это сделаете в своем Flash-ролике, будет зависеть от того, как пользователь взаимодействует с фильмом. Вы можете продолжать делать это по таймеру, или когда элемент управления теряет фокус, или когда движется мышь. По-разному.
Вы можете использовать класс 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, и я выложу его.
Хотел сделать заметку об этом решении: как только вы вернете фокус в браузер, вам потребуется, чтобы пользователь снова щелкнул плагин Flash, чтобы активировать ввод данных внутри плагина Flash. Это может вызвать раздражение у пользователей, и это следует учитывать при использовании этого решения.
<?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? Мне нравится идея фокусировки, но в полноценных браузерных приложениях не так много места, чтобы потерять фокус. Пользователь также может изменить комбинацию клавиш, я не думаю, что это полное исправление для этого без флеш-опроса конфигурации команды из браузера, а затем прослушивания комбинации, как мы в основном делаем здесь. Я не знаю.
Это также просто пытается открыть новое окно после фокусировки, для меня нет смысла заставлять пользователя нажимать его дважды, если они не блокируют окно, как всплывающее. Но фокус вызывается первым, поэтому, если это произойдет, должна сработать вторая попытка. При необходимости вы можете предупредить пользователя в приложении браузера.
В Firefox document.body.focus(); не работает. Используя ту же идею, что и решение Клаудио Сильвы для этого Проблема с Chrome, следующий JavaScript будет работать в Firefox:
document.body.tabIndex = 0;
document.body.focus();
Ниже есть решение на случай, если оно кому-то понадобится. На мой взгляд, это неплохо работает. Я могу щелкнуть мышью вокруг своего Flash, но все еще использовать все функции клавиатуры браузера (при щелчке внутри Flash фокус смещается на html-часть).
Хороший! Я не знаю ни одного бита Flash (и не хочу знать, тарелка заполнена ;-), так что это один лакомый кусок кода, который я буду массово рассылать любому Flash'еру, которого я знаю!