Если вам вдруг понадобилось связать actionscript, выполняемый в среде flash, с javascript, то нет ничего проще.. это можно сделать как по примеру от самого adobe (смотрим здесь), так и по примеру указанному ниже.. но надо отметить, что пример от adobe adobe работает только в среде as 3.0, пример ниже работает как в as 2.0, так и в as 3.0.. функции вызова думаю не составит труда написать свои...
В теле html страницы прописываем слудующий код:
<head>
....
<script type="text/javascript" src="swfobject.js"></script>
<script type="text/javascript">//<![CDATA[
var flashvars = {};
var params = {};
var attributes = {};
attributes.id = "flash1"; // идентификатор ролика
swfobject.embedSWF("путь к ролику", "flashContent", "ширина", "высота", "10.0.0", false, flashvars, params, attributes);
//]]></script>
<script type="text/javascript">//<![CDATA[
var jsReady = false,
swfReady = false;
function jsGetReady(){
return jsReady;
}
function jsSetReady(){
jsReady = true;
}
function swfSetReady(){
swfReady = true;
}
function swfMovie(movieName){
if(navigator.appName.indexOf("Microsoft") != -1)
return window[movieName];
return document[movieName];
}
function E(cc){
return (typeof(cc)!='object')? document.getElementById(cc) : cc;
}
function ....(){
var obj = swfMovie("flash1");
if(swfReady && obj){
// если flash готов, вызываем функции action script
obj.putAction(....);
}
}
//]]></script>
</head>
<body onload="jsSetReady()">
....
<div id="flashContent">
<!-- сюда будет помещен наш ролик -->
</div>
....
swfobject.js -- это скрипт для динамической вставки flash-роликов.. новую версию скачать можно здесь..
В теле же нашего ролика записываем следующий код:
import flash.external.*;
import flash.utils.*;
import flash.events.*;
var jsCheckReadyTimer:Number = 0;
if(ExternalInterface.available){
try {
if(jsGetReady()){
initConnection();
}else{
jsCheckReadyTimer = setInterval(jsCheckReady, 100);
}
}catch(error:Error){
trace("An error occurred: " + error.message);
}
}else{
trace("External interface is not available");
}
function jsGetReady():Boolean
{
var result = ExternalInterface.call("jsGetReady");
return result;
}
function jsCheckReady()
{
if(jsGetReady()){
clearInterval(jsCheckReadyTimer);
initConnection();
}
}
function initConnection()
{
ExternalInterface.addCallback("putAction", null, getAction);
ExternalInterface.call("swfSetReady");
}
function getAction(A:Number)
{
switch(A){
case 1:
break;
....
}
}
Итак, что происходит?.. когда браузер полностью загружает содержимое страницы и строит архитектуру dom, запускается событие onload="jsSetReady()" которое устанавливает, что javascript доступен для выполнения..
Ранее или позднее этого (в зависимости от самого браузера), запускается ролик и соответственно actionscript, записанный в нем.. он в свою очередь проверяет доступность модуля внешних связей ExternalInterface.available и проверяет доступность javascript'а посредством вызова функции ExternalInterface.call("jsGetReady")..
Если javascript доступен на момент запуска flash, то все происходит гладко: устанавливаются функции обратного вызова ExternalInterface.addCallback("putAction", null, getAction) и javascript'у отправлдяется уведомление, что flash готов к работе ExternalInterface.call("swfSetReady")...
Если же javascript еще не запущен, то запускается таймер setInterval(jsCheckReady, 100), который в цикле с периодом 100 мс проверяет наличие соежинения с javascript: ExternalInterface.call("jsGetReady"), как только соединение получено -- все происходит также как и написано выше..
Сожного в принципе нет ничего.. но нужно учитывать некоторые нюансы:
* динамическая вставка посредством swfobject успешно осуществляет запуск содержимого flash, исключая сбои при раннем или позднем исполнении javascript..
* контейнер для вставки flash-роликов (в нашем случае это: <div id="flashContent"></div>) должен обязательно быть видимым в структуре dom.. иначе возможнгы сбои в работе..
в остальных случаях все работает замечательно..