您的位置:首页 > Web前端 > JavaScript

JS与Flex交互的几点注意事项

2011-12-15 09:12 281 查看
一,在Flex中,addCallack所输出供给JS调用的函数名称不能与JS中己有的函数名称相重复:

ExternalInterface.addCallback("play",callThis);

上面这一句在IE中就发生错误,因为“play”这个函数名称已经被分配给DOM元素了,改一个名字就可以了,如下就正确了。
ExternalInterface.addCallback("MyPlay",callThis);

二,在向页面中嵌入swf文件时,要用Adobe的官方JS文件或者版本为2.+的SWFOBJECT。

Adobe的官方JS文件就是AC_OETags.js文件,如果你用的是Flex SDK,可以在Flex SDK安装目录下的templates文件夹中找。在用AC_OETags.js文件时,请把下面这段代码加入到页面中:

function getMovie(movieName){

if (navigator.appName.indexOf("Microsoft")!=-1){

return window[movieName];

}else{

return document[movieName];

}

}
用下面的代码调用Flex中的命令:getMovie('MyFlex').MyPlay();
如果使用的是SWFOBJECT,请使用2.0或2.0以上的版本,使用方法可以查看《翻译:SWFOBJECT 2.0官方文档》,然后使用如下语句调用Flex中的命令:swfobject.getObjectById("MyFlex").MyPlay();
mxml文件代码如下 :

<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" applicationComplete="init();" layout="vertical" verticalAlign="middle" horizontalAlign="center">

<mx:Script>

<![CDATA[

import flash.events.MouseEvent;

import flash.external.ExternalInterface;
public function init():void{

btn.addEventListener(MouseEvent.CLICK, btnClick);

ExternalInterface.addCallback("jsCallFlex",callThis);

}
public function btnClick(evt:MouseEvent):void{

ExternalInterface.call("alert","Flex调用JS方法!");

}
public function callThis():void{

mx.controls.Alert.show('JS调用Flex内部方法!');

}

]]>

</mx:Script>

<mx:Button label="点击这里" id="btn" />

</mx:Application>

html文件代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"><head>

<title>AddCallBack几个bug的解决方法</title>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<meta http-equiv="Content-Language" content="zh-CN" />

<script type="text/javascript" src="swfobject.js"></script>

</head>

<body>

<div style="text-align:center;">

<div>

<object id="flexApp" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="500" height="320">

<param name="movie" value="addCallBack.swf" />

<!--[if !IE]>-->

<object type="application/x-shockwave-flash" data="addCallBack.swf" width="500" height="320">

<!--<![endif]-->

<div>

<h1>Alternative content</h1>

<p><a href="http://www.adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>

</div>

<!--[if !IE]>-->

</object>

<!--<![endif]-->

</object>

</div>

<p><input type="button" value="点击这里" id="myBtn" /></p></div>

<script type="text/javascript">

//<![CDATA[

swfobject.registerObject("flexApp", "9.0.0", "expressInstall.swf");
document.getElementById('myBtn').onclick=function(){

var obj = swfobject.getObjectById("flexApp");

if(obj){

obj.jsCallFlex();

}

};

//]]>

</script>

</body></html>
三,Flex中调用“init()”语句的命令最好放在“applicationComplete”中。

即mxml文件代码中的第二行:

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" applicationComplete="init();" layout="vertical" verticalAlign="middle" horizontalAlign="center">
因为有时JS调用Flex的命令中需要用到Flex的组件做出反应,如果用creationComplete 调用“init()”有可能会发错,所以最好是用applicationComplete。creationComplete是在组件定义完成并已经在显示列表时触发,而applicationComplete是在所有的组件初始化完成并显示时触发。关于此方面的更多详情请查看Flex Application 初始化顺序。
四,注意页面文件编码格式

即文件的encoding类型,这个本来不算问题的,但却让我碰到了,文件编码格式不对称有时在IE中显示不了内容。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: