2011-01-22 2 views
2

ВопросКогда Javascript начнет вызывать ActionScript?

Есть не-опросным путем для Javascript командовать Flash-право, когда его внешний интерфейс готов?

фон

В Actionscript, я зарегистрировал функцию Javascript для вызова:

ExternalInterface.addCallback('doStuff", this.doStuff); 

Я использую SWFObject встроить Flash, в моей странице:

swfobject.embedSWF(
    'flash/player.swf', 
    'flashPlayer', 
    '100%', 
    '100%', 
    '9', 
    'expressInstallSwfTODO.swf', 
    {}, 
    {allowfullscreen: true}, 
    {}, 
    function(status) { 
     if (!status.success) { 
      alert('Failed to embed Flash player'); 
     } else { 
      $('flashPlayer').doStuff(); 
     } 
    }.bind(this) 
); 

SWFObject позволяет запускать код, когда Flash был успешно внедрен через обратный вызов. Я пытаюсь запустить $ ('flashPlayer'). DoStuff в этом обратном вызове, но он утверждает, что он не определен. Кажется, что Flash нужно некоторое время, чтобы загрузить свой внешний интерфейс. Таким образом, я использовал избирательный хак, чтобы выяснить, когда внешний интерфейс готов:

new PeriodicalExecutuer(
function(poller) { 
    if ($('flashPlayer').doStuff) { 
    $('flashPlayer').doStuff(); 
    poller.stop() 
    } 
}, 
0.2 
); 

Это Poller не является идеальным. Есть визуально заметная задержка в выполнении doStuff, и это делает мою общую структуру кода грязной.

+0

OnLoad будет гладкой но медленнее. Выбирайте. –

ответ

4

В Javascript:

function flashIsReady() 
{ 
    $('flashPlayer').doStuff(); 
} 

В Actionscript:

if (ExternalInterface.available) { 
    ExternalInterface.addCallback('doStuff', this.doStuff); 
    ExternalInterface.call("flashIsReady"); 
} 
+0

А что, если ExternalInterface недоступно при запуске этой AS? – JoJo

+0

[ExternalInterface.available] (http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/flash/external/ExternalInterface.html#available) говорит: «Указывает, находится ли этот проигрыватель в контейнере, который предлагает внешний интерфейс ». Я считаю, что это означает, что если оно ложно, оно всегда будет ложным в этом браузере, поэтому нет смысла снова проверять. – clockworkgeek

0

Я сделал решение опроса. В ActionScript У меня есть функция, как это:

private function extIsInterfaceReady():Boolean { 
    return ExternalInterface.available; 
} 

И в JavaScript, после того, как событие «onFlashReady» Я также закодированной в intialization, я начинаю интервал, как это:

this.poll_flash = setInterval(function() { 
    if (typeof this.flash_obj === 'undefined') { 
     return false; 
    } 

    if (typeof this.flash_obj.isInterfaceReady === 'undefined') { 
     return false; 
    } 

    if (this.flash_obj.isInterfaceReady()) { 
     clearInterval(this.poll_flash); 
     return this.continueOn(); 
    } 
    }, 100); 
Смежные вопросы