Я пытался настроить эту тестовую страницу для своей флеш-игры, но она не хочет сосредоточиться на загрузке. Я прочитал кучу записей в форуме и не получил от него ничего, я не могу поверить, что это должно быть так сложно.
Вот что я имею:
UP HERE WE ESCAPE THE RAT RACE
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script>
<script type="text/javascript">
swfobject.embedSWF("UpHere.swf", "myContent", "700", "300", "9.0.0");
function setFocusOnFlash() {
var fl = document.getElementById("myContent");
if (fl) { fl.focus(); }
}
</script>
Alternative content
You can see it live here, http://joon.be/exclusivepreview/
что с этим не так? У меня нет очень глубокого знания swfObject ...
Я нашел способ, который работает для меня в 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 . Чтобы быть ясным, вы делаете это в Flash/ActionScript, поэтому вам нужен доступ к источнику или автору SWF-файла. Таким образом, когда SWF запускается, он вызывает JavaScript-код flashLoaded
на странице встраивания HTML, поэтому вы знаете, что он готов. Функция была такой:
function flashLoaded() {
//Oddly, directly calling setFocusOnFlash() didn't work on IE8
setTimeout(setFocusOnFlash, 1);
}
Способ сделать это - использовать ExternalInterface и отправить фокус на Flash с помощью JS-слушателя в событии табуляции (т. Е. Когда вкладка удаляется от элемента до Flash). На практике это сложно, и обработка stage.focus в вашей AS требует решения некоторых, erm, quirks. Но он действительно работает в перекрестном браузере
Я отчаянно искал эту работу, просто чтобы ускорить разработку своей собственной Flash-игры, чтобы не нажимать каждый раз, чтобы проверить свою игру. Поэтому мне было все равно, работает ли он во всех браузерах, поэтому вот что работает только на Chrome.
Если вы попробовали focus () раньше, и это не сработало для вас, обратите внимание, что вам нужно использовать только тег embed , а не версию объекта и параметра.
Протестировано в Chrome версии 40.0.2214.93 (64-разрядная версия).
Метод, который вы используете, будет работать только с Internet Explorer - это ограничение способа использования вспышки.