Как сделать так, чтобы мой объект Flash был сфокусирован на нагрузке? - PullRequest
5 голосов
/ 28 октября 2011

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

Вот что у меня есть:

  <head>
<title>UP HERE WE ESCAPE THE RAT RACE</title>
<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>
  </head>
  <body  onload="setFocusOnFlash()">
  <div style="margin:0 auto; text-align:center; width:700px;">
    <div id="myContent" style="margin:0 auto; text-align:center; width:700px;">
      <p>Alternative content</p>
    </div>
     </div>
      </body>

Вы можете увидеть это в прямом эфире здесь, http://joon.be/exclusivepreview/

что с ним не так? Я не очень хорошо знаю swfObject ...

Ответы [ 4 ]

6 голосов
/ 03 декабря 2012

Я нашел способ, который работает для меня на 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);
}
1 голос
/ 12 апреля 2015

Я отчаянно пытался получить эту работу, просто чтобы ускорить мою собственную разработку Flash-игры, чтобы избежать необходимости нажимать каждый раз, чтобы протестировать мою игру.Поэтому мне было все равно, работает ли он во всех браузерах, поэтому вот тот, который работает только в Chrome.

<body onload='document.getElementById("haxe").focus();'>
    <embed src="game.swf" id="haxe" ...

Если вы уже пробовали использовать focus () и он не работает для вас,что вы должны использовать только тег embed , а не версию объекта и параметра.

Проверено на Chrome версии 40.0.2214.93 (64-разрядная версия).

1 голос
/ 12 июля 2012

Способ сделать это - использовать ExternalInterface и отправить фокус во Flash, используя JS-прослушиватель для события вкладки (т. Е. Когда вкладка удаляется от элемента до Flash).На практике это сложно, и обработка stage.focus в вашей AS должна иметь дело с некоторыми причудами.Но он работает в значительной степени кросс-браузер

0 голосов
/ 28 октября 2011

Используемый вами метод будет работать только с Internet Explorer - это ограничение использования флэш-памяти.

http://kb2.adobe.com/cps/155/tn_15586.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...