Я нашел способ, который работает для меня на Firefox 16, Chrome 23 и IE 8 (это то, где я тестировал это до сих пор).Конечно, это куча хаков, так что кто знает, будет ли это работать вечно ... но это точно не усугубит ситуацию.
function setFocusOnFlash() {
var flash = document.getElementById("theIdOfTheObjectElement");
flash.tabIndex = 1234; // This was needed on Chrome 23
flash.focus();
// Attention: FireFox needs wmode "opaque"!
}
Только на Firefox, <param name="wmode" value="opaque">
под object
элемент также был необходим, иначе focus()
не имел никакого эффекта.(Я использовал jquery.flash
Стивена Беленджера, где вы можете указать wmode
; я полагаю, это также возможно с SWFObject
.)
Но самая сложная часть заключается в том, что вы не должны вызывать setFocusOnFlash
слишком рано,Для Chrome и IE добавление setTimeout(setFocusOnFlash, 1)
непосредственно после того, как JavaScript, который вставляет объект, сработал.Прямого выдачи setFocusOnFlash()
не было.Я предполагаю, что хитрость заключается в том, что синхронизированные обратные вызовы вызываются только после того, как браузер полностью обработал изменение документа, независимо от указанной вами задержки.Но на Firefox звонить с такой небольшой задержкой было слишком рано;он поставил пунктирную границу вокруг элемента object
(не должен), и Flash не получил нажатия клавиш.Установка задержки на 250 исправила это на моем компьютере, но кто знает, какая большая задержка вам нужна.(Хуже того, повторение вызовов setFocusOnFlash
тоже не помогло ... как только эта пунктирная граница была там, они не имели никакого дальнейшего эффекта.) Итак, вместо этого я добавил обратный вызов ExternalInterface.call("flashLoaded")
к флэш-памяти конструктор класса документа.Чтобы было ясно, вы делаете это во Flash / ActionScript, поэтому вам нужен доступ к источнику или автору SWF-файла.Таким образом, когда SWF запускается, он вызывает метод JavaScript flashLoaded
для встраивания HTML-страницы, чтобы вы знали, что он готов.Функция была как:
function flashLoaded() {
// Oddly, directly calling setFocusOnFlash() didn't work on IE8
setTimeout(setFocusOnFlash, 1);
}