一、getURL方法
flash中可以用getURL方法来调用JS中的函数。

例:

flash研究(三)——Falsh与JavaScript交互_FlashGetURL_btn.onRelease = function(){
flash研究(三)——Falsh与JavaScript交互_javascript_02    getURL(
"javascript:window.showModalDialog(location.href,'','dialogWidth:562px;dialogHeight:468px;status:no;resizable:yes;help:no');");
flash研究(三)——Falsh与JavaScript交互_html_03}


上面例子是点击按钮在新窗口中打开当前网页,用getURL直接将JS代码作为参数写在flash中。也可以使用 GET  POST 发送变量。下面的示例使用 GET将变量追加到 URL

flash研究(三)——Falsh与JavaScript交互_Flash_04var firstName:String = "Gus";
flash研究(三)——Falsh与JavaScript交互_Flash_04
var lastName:String = "Richardson";
flash研究(三)——Falsh与JavaScript交互_Flash_04
var age:Number = 92;
flash研究(三)——Falsh与JavaScript交互_FlashmyBtn_btn.onRelease 
= function() {
flash研究(三)——Falsh与JavaScript交互_javascript_02 getURL(
"http://www.macromedia.com""_blank""GET");
flash研究(三)——Falsh与JavaScript交互_html_03}
;
flash研究(三)——Falsh与JavaScript交互_Flash_04

注:
1)        当使用 getURL() 调用 JavaScript 时,url 参数最多只能包含 508 个字符。
2)        只有将falsh发布到网页上面,此方法才有效,直接在swf文件中调会报异常。

二、ExternalInterface接口

1)        addCallback(methodName:String, instance:Object, method:Function) : Boolean
注册一个被js调的as方法。

methodName:从js中调用 as 函数时使用的名称。此名称不必与 as 方法的实际名称匹配。 
instance:在该方法中被解析成的对象。此对象不一定是在其上可找到该方法的对象,可以指定任何对象(或 null)。
method js中调用的 as方法。

2)        call(MethodName:String, [Parameters:Object]) : Object
flash中直接调用一个js函数。

这个方法有两个参数:
MethodName:你想要调用的javascript函数名要以字符串的形式。
Parameters:需要传递给javascript函数的参数,用逗号分开,是可选的。

三、实例

下面是在网上找的一个实例,加入了本人的整合、说明:

Flash代码:

flash研究(三)——Falsh与JavaScript交互_Flash_04import flash.external.*;
flash研究(三)——Falsh与JavaScript交互_Flash_04
// 注册的方法名字,JavaScript将使用这个名字调用
flash研究(三)——Falsh与JavaScript交互_Flash_04
var methodName:String = "send2AS";
flash研究(三)——Falsh与JavaScript交互_Flash_04
var instance:Object = null;
flash研究(三)——Falsh与JavaScript交互_Flash_04
// 实际调用的函数
flash研究(三)——Falsh与JavaScript交互_Flash_04
var method:Function = receiveMsg;
flash研究(三)——Falsh与JavaScript交互_Flash_04
// 返回值表示是否注册成功
flash研究(三)——Falsh与JavaScript交互_Flash_04
var wasSuccessful:Boolean = ExternalInterface.addCallback(methodName, instance, method);
flash研究(三)——Falsh与JavaScript交互_Flash
function receiveMsg(msg:String) {
flash研究(三)——Falsh与JavaScript交互_javascript_02    info_txt.text 
+= newline;
flash研究(三)——Falsh与JavaScript交互_javascript_02    info_txt.text 
+= "<font color='#0000FF'>JS说:</font>"+newline+msg;
flash研究(三)——Falsh与JavaScript交互_html_03}

flash研究(三)——Falsh与JavaScript交互_Flash_04
// 发送消息
flash研究(三)——Falsh与JavaScript交互_Flash_04
var btnObj:Object = new Object();
flash研究(三)——Falsh与JavaScript交互_FlashbtnObj.click 
= function() {
flash研究(三)——Falsh与JavaScript交互_javascript_02    sendMsg(send_txt.text);
flash研究(三)——Falsh与JavaScript交互_html_03}
;
flash研究(三)——Falsh与JavaScript交互_Flash_04
//调JavaScript函数
flash研究(三)——Falsh与JavaScript交互_Flash
function sendMsg(msg:String) {
flash研究(三)——Falsh与JavaScript交互_javascript_30    
if (msg != ""{
flash研究(三)——Falsh与JavaScript交互_javascript_02        ExternalInterface.call(
"send2JS", msg);
flash研究(三)——Falsh与JavaScript交互_html_32    }

flash研究(三)——Falsh与JavaScript交互_html_03}

flash研究(三)——Falsh与JavaScript交互_Flash_04
//用getURL直接调JS
flash研究(三)——Falsh与JavaScript交互_Flash
GetURL_btn.onRelease = function(){
flash研究(三)——Falsh与JavaScript交互_javascript_02    getURL(
"javascript:window.showModalDialog(location.href,'','dialogWidth:562px;dialogHeight:468px;status:no;resizable:yes;help:no');");
flash研究(三)——Falsh与JavaScript交互_html_03}

flash研究(三)——Falsh与JavaScript交互_Flash_04
//初始化
flash研究(三)——Falsh与JavaScript交互_Flash
function init() {
flash研究(三)——Falsh与JavaScript交互_javascript_02    info_txt.html 
= true;
flash研究(三)——Falsh与JavaScript交互_javascript_02    send_txt.text 
= "";
flash研究(三)——Falsh与JavaScript交互_javascript_02    send_btn.addEventListener(
"click", btnObj);
flash研究(三)——Falsh与JavaScript交互_javascript_02    Key.addListener(keyObj);
flash研究(三)——Falsh与JavaScript交互_html_03}

flash研究(三)——Falsh与JavaScript交互_Flash_04init();

网页代码:

flash研究(三)——Falsh与JavaScript交互_Flash_04<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN" lang="zh-CN">
flash研究(三)——Falsh与JavaScript交互_Flash_04
<head>
flash研究(三)——Falsh与JavaScript交互_Flash_04
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
flash研究(三)——Falsh与JavaScript交互_Flash_04
<title>as-js</title>
flash研究(三)——Falsh与JavaScript交互_Flash_04
flash研究(三)——Falsh与JavaScript交互_Flash
<script language="JavaScript">
flash研究(三)——Falsh与JavaScript交互_javascript_02    
function send2JS(msg)
flash研究(三)——Falsh与JavaScript交互_javascript_30    
{
flash研究(三)——Falsh与JavaScript交互_javascript_02        document.getElementById(
'jstxt').innerHTML += "<font color='blue'>AS</font> 说:<br />" + msg + "<br />";
flash研究(三)——Falsh与JavaScript交互_html_32    }

flash研究(三)——Falsh与JavaScript交互_javascript_02    
function receiveMsg(msg)
flash研究(三)——Falsh与JavaScript交互_javascript_30    
{
flash研究(三)——Falsh与JavaScript交互_javascript_02        document.getElementById(
'jstxt').innerHTML += "<font color='blue'>AS</font> 说:<br />" + msg + "<br />";
flash研究(三)——Falsh与JavaScript交互_html_32    }

flash研究(三)——Falsh与JavaScript交互_javascript_02    
// 发送消息
flash研究(三)——Falsh与JavaScript交互_javascript_02
    function sendmsg()
flash研究(三)——Falsh与JavaScript交互_javascript_30    
{
flash研究(三)——Falsh与JavaScript交互_javascript_02        document.getElementById(
'as_js').send2AS(document.getElementById('send_txt').value);
flash研究(三)——Falsh与JavaScript交互_html_03    }

flash研究(三)——Falsh与JavaScript交互_Flash_04
</script>
flash研究(三)——Falsh与JavaScript交互_Flash_04
</head>
flash研究(三)——Falsh与JavaScript交互_Flash_04
<body bgcolor="#cccccc">
flash研究(三)——Falsh与JavaScript交互_Flash_04
<input id= "send_txt" type="text" value = "aaaaa"><input name="" value = "callFlash" type="button" onClick = "sendmsg();">
flash研究(三)——Falsh与JavaScript交互_Flash_04
<div id = "jstxt"><div/>
flash研究(三)——Falsh与JavaScript交互_Flash_04
flash研究(三)——Falsh与JavaScript交互_Flash_04
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="550" height="400" id="as_js" align="middle">
flash研究(三)——Falsh与JavaScript交互_Flash_04
<param name="allowScriptAccess" value="sameDomain" />
flash研究(三)——Falsh与JavaScript交互_Flash_04
<param name="movie" value="as-js.swf" />
flash研究(三)——Falsh与JavaScript交互_Flash_04
<param name="quality" value="high" />
flash研究(三)——Falsh与JavaScript交互_Flash_04
<param name="bgcolor" value="#cccccc" />
flash研究(三)——Falsh与JavaScript交互_Flash_04
<embed src="as-js.swf" quality="high" bgcolor="#cccccc" width="550" height="400" name="as-js" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
flash研究(三)——Falsh与JavaScript交互_Flash_04
</object>
flash研究(三)——Falsh与JavaScript交互_Flash_04
</body>
flash研究(三)——Falsh与JavaScript交互_Flash_04
</html>
flash研究(三)——Falsh与JavaScript交互_Flash_04


运行效果:

flash研究(三)——Falsh与JavaScript交互_javascript_81

 

点击“GetURLJS”按钮,效果:

flash研究(三)——Falsh与JavaScript交互_Flash_82

 

代码比较简单,有注释,就不分析了。

注:

1)        例子中getElementByIdIE的方法,如果换成其它浏览器,不一定能运行出效果,所以最好用下面的方法:

flash研究(三)——Falsh与JavaScript交互_Flash_04    var flashVideoPlayer;
flash研究(三)——Falsh与JavaScript交互_Flash_04    
function initialize() 
flash研究(三)——Falsh与JavaScript交互_Flash    
{
flash研究(三)——Falsh与JavaScript交互_javascript_02        
var ie = navigator.appName.indexOf("Microsoft"!= -1;
flash研究(三)——Falsh与JavaScript交互_javascript_02        flashVideoPlayer 
= (ie) ? window['FlashVisitOracle'] : document['FlashVisitOracle'];
flash研究(三)——Falsh与JavaScript交互_html_03    }

flash研究(三)——Falsh与JavaScript交互_Flash_04


2)        承载flashhtml文件在本地运行会报错

flash研究(三)——Falsh与JavaScript交互_javascript_90
点击是调试,调试代码如下:

 

flash研究(三)——Falsh与JavaScript交互_Flashfunction __flash__arrayToXML(obj) {
flash研究(三)——Falsh与JavaScript交互_javascript_02    
var s = "<array>";
flash研究(三)——Falsh与JavaScript交互_javascript_30    
for (var i=0; i<obj.length; i++{
flash研究(三)——Falsh与JavaScript交互_javascript_02        s 
+= "<property id=\"" + i + "\">" + __flash__toXML(obj[i]) + "</property>";
flash研究(三)——Falsh与JavaScript交互_html_32    }

flash研究(三)——Falsh与JavaScript交互_javascript_02    
return s+"</array>";
flash研究(三)——Falsh与JavaScript交互_html_03}

flash研究(三)——Falsh与JavaScript交互_Flash
function __flash__argumentsToXML(obj,index) {
flash研究(三)——Falsh与JavaScript交互_javascript_02    
var s = "<arguments>";
flash研究(三)——Falsh与JavaScript交互_javascript_30    
for (var i=index; i<obj.length; i++{
flash研究(三)——Falsh与JavaScript交互_javascript_02        s 
+= __flash__toXML(obj[i]);
flash研究(三)——Falsh与JavaScript交互_html_32    }

flash研究(三)——Falsh与JavaScript交互_javascript_02    
return s+"</arguments>";
flash研究(三)——Falsh与JavaScript交互_html_03}

flash研究(三)——Falsh与JavaScript交互_Flash
function __flash__objectToXML(obj) {
flash研究(三)——Falsh与JavaScript交互_javascript_02    
var s = "<object>";
flash研究(三)——Falsh与JavaScript交互_javascript_30    
for (var prop in obj) {
flash研究(三)——Falsh与JavaScript交互_javascript_02        s 
+= "<property id=\"" + prop + "\">" + __flash__toXML(obj[prop]) + "</property>";
flash研究(三)——Falsh与JavaScript交互_html_32    }

flash研究(三)——Falsh与JavaScript交互_javascript_02    
return s+"</object>";
flash研究(三)——Falsh与JavaScript交互_html_03}

flash研究(三)——Falsh与JavaScript交互_Flash
function __flash__escapeXML(s) {
flash研究(三)——Falsh与JavaScript交互_javascript_02    
return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
flash研究(三)——Falsh与JavaScript交互_html_03}

flash研究(三)——Falsh与JavaScript交互_Flash
function __flash__toXML(value) {
flash研究(三)——Falsh与JavaScript交互_javascript_02   
var type = typeof(value);
flash研究(三)——Falsh与JavaScript交互_javascript_30    
if (type == "string"{
flash研究(三)——Falsh与JavaScript交互_javascript_02        
return "<string>" + __flash__escapeXML(value) + "</string>";
flash研究(三)——Falsh与JavaScript交互_javascript_30    }
 else if (type == "undefined"{
flash研究(三)——Falsh与JavaScript交互_javascript_02        
return "<undefined/>";
flash研究(三)——Falsh与JavaScript交互_javascript_30    }
 else if (type == "number"{
flash研究(三)——Falsh与JavaScript交互_javascript_02        
return "<number>" + value + "</number>";
flash研究(三)——Falsh与JavaScript交互_javascript_30    }
 else if (value == null{
flash研究(三)——Falsh与JavaScript交互_javascript_02        
return "<null/>";
flash研究(三)——Falsh与JavaScript交互_javascript_30    }
 else if (type == "boolean"{
flash研究(三)——Falsh与JavaScript交互_javascript_02        
return value ? "<true/>" : "<false/>";
flash研究(三)——Falsh与JavaScript交互_javascript_30    }
 else if (value instanceof Date) {
flash研究(三)——Falsh与JavaScript交互_javascript_02        
return "<date>" + value.getTime() + "</date>";
flash研究(三)——Falsh与JavaScript交互_javascript_30   }
 else if (value instanceof Array) {
flash研究(三)——Falsh与JavaScript交互_javascript_02       
return __flash__arrayToXML(value);
flash研究(三)——Falsh与JavaScript交互_javascript_30   }
 else if (type == "object"{
flash研究(三)——Falsh与JavaScript交互_javascript_02       
return __flash__objectToXML(value);
flash研究(三)——Falsh与JavaScript交互_javascript_30   }
 else {
flash研究(三)——Falsh与JavaScript交互_javascript_02        
return "<null/>"//???
flash研究(三)——Falsh与JavaScript交互_html_32
    }

flash研究(三)——Falsh与JavaScript交互_html_03}

flash研究(三)——Falsh与JavaScript交互_Flash
function __flash__addCallback(instance, name) {
flash研究(三)——Falsh与JavaScript交互_javascript_30  instance[name] 
= function () 
flash研究(三)——Falsh与JavaScript交互_javascript_02    
return eval(instance.CallFunction("<invoke name=\""+name+"\" returntype=\"javascript\">" + __flash__argumentsToXML(arguments,0+ "</invoke>"));
flash研究(三)——Falsh与JavaScript交互_html_32  }

flash研究(三)——Falsh与JavaScript交互_html_03}

flash研究(三)——Falsh与JavaScript交互_Flash
function __flash__removeCallback(instance, name) {
flash研究(三)——Falsh与JavaScript交互_javascript_02  instance[name] 
= null;
flash研究(三)——Falsh与JavaScript交互_html_03}

flash研究(三)——Falsh与JavaScript交互_Flash_04

    在网上查了一下,遇到这个问题的人相当多,也给出了一些解决的方法,我试了都没用,发布一下用http://地址浏览就没任何问题了。原因我也不是很清楚。有 高手知道,欢迎分享。

四、扩展

在做flashjs交互时遇到了这么一个问题:我要在调用承载flashhtml页面时,通过URL将参数传递给html页面,html在加载flash时通过调用flash中的方法将参数传进flash来初始化flash。但这样每次在调用flash方法的时候都报异常说,对象或方法不可用(IE7中做的测试),原因是flash还没有加载上,当然不能调用其中的方法了,延时处理一下就好了。

例:

flash研究(三)——Falsh与JavaScript交互_Flash_04<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN" lang="zh-CN">
flash研究(三)——Falsh与JavaScript交互_Flash_04
<head>
flash研究(三)——Falsh与JavaScript交互_Flash_04
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
flash研究(三)——Falsh与JavaScript交互_Flash_04
<title>DianLi</title>
flash研究(三)——Falsh与JavaScript交互_Flash
<script type ="text/javascript" language="javascript">
flash研究(三)——Falsh与JavaScript交互_javascript_02    
//取URL中的参数
flash研究(三)——Falsh与JavaScript交互_javascript_02
    function getParameter(RQ)
flash研究(三)——Falsh与JavaScript交互_javascript_30    
{
flash研究(三)——Falsh与JavaScript交互_javascript_02         
var url=location.href;
flash研究(三)——Falsh与JavaScript交互_javascript_02         
var parameters=url.substr(url.indexOf("?")+1);
flash研究(三)——Falsh与JavaScript交互_javascript_02         
var parameterItems=parameters.split("&");
flash研究(三)——Falsh与JavaScript交互_javascript_02         
var parameterName;
flash研究(三)——Falsh与JavaScript交互_javascript_02         
var parameterVar;
flash研究(三)——Falsh与JavaScript交互_javascript_02         
for(i in parameterItems)
flash研究(三)——Falsh与JavaScript交互_javascript_30         
{
flash研究(三)——Falsh与JavaScript交互_javascript_02              parameterName
=parameterItems[i].split("=")[0];
flash研究(三)——Falsh与JavaScript交互_javascript_02              parameterVar
=parameterItems[i].split("=")[1];
flash研究(三)——Falsh与JavaScript交互_javascript_02              
if(parameterName==RQ)
flash研究(三)——Falsh与JavaScript交互_javascript_30              
{
flash研究(三)——Falsh与JavaScript交互_javascript_02                   
return(parameterVar);
flash研究(三)——Falsh与JavaScript交互_html_32              }

flash研究(三)——Falsh与JavaScript交互_html_32         }

flash研究(三)——Falsh与JavaScript交互_html_32    }

flash研究(三)——Falsh与JavaScript交互_javascript_02    
//调flash中的方法
flash研究(三)——Falsh与JavaScript交互_javascript_02
    function callFlashFunction(sendValue) 
flash研究(三)——Falsh与JavaScript交互_javascript_30    
{
flash研究(三)——Falsh与JavaScript交互_javascript_02        
try
flash研究(三)——Falsh与JavaScript交互_javascript_30        
{
flash研究(三)——Falsh与JavaScript交互_javascript_02            window.document.DianLi.UpdateByDate(sendValue);
flash研究(三)——Falsh与JavaScript交互_html_32        }
  
flash研究(三)——Falsh与JavaScript交互_javascript_02        
catch(e)
flash研究(三)——Falsh与JavaScript交互_javascript_30        
{
flash研究(三)——Falsh与JavaScript交互_javascript_02            setTimeout(
"callFlashFunction(getParameter('RQ'))",200)
flash研究(三)——Falsh与JavaScript交互_html_32        }
        
flash研究(三)——Falsh与JavaScript交互_html_03    }

flash研究(三)——Falsh与JavaScript交互_Flash_04
</script>
flash研究(三)——Falsh与JavaScript交互_Flash_04
</head>
flash研究(三)——Falsh与JavaScript交互_Flash_04
<body style ="margin:-1px" scroll="no" >
flash研究(三)——Falsh与JavaScript交互_Flash_04
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="100%" height="100%" id="DianLi" align="middle">
flash研究(三)——Falsh与JavaScript交互_Flash_04
<param name="allowScriptAccess" value="sameDomain" />
flash研究(三)——Falsh与JavaScript交互_Flash_04
<param name="movie" value="DianLi.swf" /><param name="quality" value="high" /><param name="bgcolor" value="#ffffff" /><embed src="DianLi.swf" quality="high" bgcolor="#ffffff" width="100%" height="100%" name="DianLi" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
flash研究(三)——Falsh与JavaScript交互_Flash_04
</object>
flash研究(三)——Falsh与JavaScript交互_Flash
<script language="javascript" type="text/javascript">
flash研究(三)——Falsh与JavaScript交互_html_03    callFlashFunction(getParameter(
"RQ"));
flash研究(三)——Falsh与JavaScript交互_Flash_04
</script>
flash研究(三)——Falsh与JavaScript交互_Flash_04
</body>
flash研究(三)——Falsh与JavaScript交互_Flash_04
</html>
flash研究(三)——Falsh与JavaScript交互_Flash_04
    FlashJavaScript交互的方法和常见的问题基本就这些了,另外还在网上找了一个第三方的FlashJavaScript交互的工具JavaScriptFlashGateway,试了试总觉得没flash自身的ExternalInterface简单好用。如果还有其它的方法,请不吝共享。