Я согласен с Робсоном, что это условие гонки, но дело не в том, чтобы «записать Flash-тег», а добавление таймера не является хорошим решением - на самом деле это очень опасно.
Проблема в том, что сам SWF не загружен и имел возможность инициализировать ваш внешний интерфейс. Для небольших SWF-файлов в Chrome время может быть более чувствительным, чем в других браузерах, но основная проблема не связана с Chrome.
Что вам нужно сделать, это:
В ActionScript
Вызовите эту функцию из вашего конструктора:
public function InitializeExternalInterface():void
{
if (ExternalInterface.available) {
// register actionscript functions so they can be called by JS
ExternalInterface.addCallback("activate", activate);
Security.allowDomain("www.example.com");
// send message to parent page that SWF is loaded and interface active
trace("External Interface Initialized...");
ExternalInterface.call("flashInitialized")
}
else
{
trace("ERROR: External Interface COULD NOT BE Initialized...");
}
}
В вашем HTML
<script>
function flashInitialized()
{
alert("Initialized!"); // remove this obviously!
$('#Main')[0].activate(); // safe to call Flash now
}
</script>
На локальном компьютере вы можете обнаружить, что он работает без этого, но как только вы добавите сетевые задержки в уравнение, вы пожалеете, что этого не сделали. Произвольный таймер - плохая идея, потому что вы все равно получите ошибку при медленном соединении. Этот метод позволяет странице вызывать флэш-объект в самое ближайшее время.
Примечание: Использование шаблона «готово» в jQuery НЕ является решением проблемы - хотя сначала я принял его за один.
$(function()
{
$('#animation')[0].SetTitle("Hello");
}
Кроме того, swfobject's callbackFn
также не является решением, поскольку просто сообщает, когда тег вставлен, а не когда загружен SWF.