http://flashteam.tencent.com/post/268/externalinterface%E4%B8%8E%E9%A1%B5%E9%9D%A2%E4%BA%A4%E4%BA%92%E7%9A%84%E4%B8%A4%E4%B8%AAbug%E6%80%BB%E7%BB%93/
最近在工作中发现ExternalInterface与页面通信的两个问题,造成了很大的困扰,特此总结。
1,无法通过ExternalInterface.call传递“\”反斜杠。
常见情况:
对于文本框之类的UGC(User Generate Content),当UGC中出现了“\”反斜杠,通过ExternalInterface.call作为参数传递到页面上时,会引发__flashToXml__这类flash注册到页面上的JS函数报错。
原因:
ExternalInterface只是简单的把参数加上了“”双引号就传递给了页面,当出现了“\”反斜杠时,就会引发转义,造成页面错误
解决方法:
将“\”转编为“\\”
或者直接使用现成的代码:
private static function EscapeMessage(message:*):* {
if (message is String) {
message = EscapeString(message);
}
else if (message is Array) {
message = EscapeArray(message);
}
else if (message is Object) {
message = EscapeObject(message);
}
return message;
}
private static function EscapeString(message:String):String {
var replacePattern:RegExp = /\\/g; //new RegExp("/\\/", "g");
return message.replace(replacePattern, "\\\\");
}
private static function EscapeArray(message_array:Array):Array {
var length:uint = message_array.length;
var i:uint = 0;
for (i; i < length; i++) {
message_array[i] = EscapeMessage(message_array[i]);
}
return message_array;
}
private static function EscapeObject(message_obj:Object):Object {
for (var name:String in message_obj) {
message_obj[name] = EscapeMessage(message_obj[name]);
}
return message_obj;
}
2,当flash初始化较重时,在非IE内核的IE浏览器下,会造成ExternalInterface.addCallBack绑定不成功的情况出现。
解决办法:
通过页面检测!!flashObj.fucntion是否存在,不存在则由JS重新在页面上生成对应的通信函数(具体可参考youyee写的ExternalInterface 与 JavaScript)
另:在TT和QQ5浏览器下,缓存的SWF会出现页面无法向AS端传递数据的情况出现(无论是addCallBack或JavaScript的return值)
解决方法:
使用innerHTML插入src为空的flash的object标签,再使用setTimeout设置object的movie或data值。
另2:Firefox下,某些情况下,有flash加载2~3次,并且是静默替换(不触发flash内部函数)的情况出现,会导致第一次初始化的数据消失。
出现原因不明。
暂时解决方法:
数据请求由flash端发起,循环不断请求。不要由JavaScript直接设置数据。
分享到:
相关推荐
as3.0利用ExternalInterface与js交互的播放器,重写flvPlayerbeta0.1例子
ExternalInterface在我看来就是flash为了外部程序的调用所声明的接口。看到论坛里有好多人问但是回答的就不是很多,就把自己做的一个简单的例子放上来.写的不好,希望能抛砖引玉,大侠勿拍!!这个是里面用到的flash...
flex与js交互 关于ExternalInterface使用的小例子
ExternalInterface
flex与javascript交互利用externalinterface.callback函数进行。
网路上找的残缺不齐 甚至没有返回值。 我这个不是两个专案,但关键代码都齐。 学个三个月以上的,就看得懂。 代码贴对地方,可以直接运行。 新手别下。
3、使用Flash中的ExternalInterface.call方法和fscommand方法对JS进行调用与传送数据。 4、使用Flash中的ExternalInterface.addCallback方法创建接口,使JS能够调用AS中的函数。 包含swfobject.js与fla源文件。 (*...
与asp js交互数据实现 ------------------------------ import fl.controls.Button; import fl.core.UIComponent; var TF : TextFormat = new TextFormat(); TF.size = 16; TF.color = 0x0000ff; key.setStyle(...
flex和javascript交互.在Flex中可以用ExternalInterface来调用Flex的方法
OpenSPARCT1 External Interface
js-communicate INTRAS-JS的交互通讯模块,提供了JS中模拟AS3事件监听处理方式用于取代AS直接调页面接口的方式。使用该库将为SWF提供三个接口给JS来调用:notify,用于JS调AS中的接口swf.notify('pausePlayer', [p1,...
vb动态加载ShockwaveFlash控件,解决了静态加载无法保存问题 flash利用ExternalInterface类创建外部函数以及通过fscommand发送参数 vb使用带事件定义变量。 完成 flash与vb的双向通信。
与浏览器的通信能够让 你建立一个可以超越Flex 应用本身的应用程序。你可以连接到已有的地址,通过JavaScript 和其他应用程序通信,并且可以和浏览器的历史记录交互,作为开始。ExternalInterface 类 让你能够调用...
flash as 3.0通过ExternalInterface与c#通信
自制的,两个简单实例实现Flash与JS的相互调用与传值,仅实现基本功能,可在此原理基础上对函数进行拓展,例如使用Flash封装网页数据等。 在AS代码中附有简单注释解释程序。 ======== 简 单 介 绍 ======== 1、...
在ActionScript3.0与JavaScipt通信的时候需要用到ExternalInterface类。 “ExternalInterface”类是外部API,在ActionScript和FlashPlayer的容器之间实现直接通讯的应用程序编程接口,例如,含有JavaScript的HTML页...
flash制作的一个适用于网页的软键盘,JS和FLASH的交互,externalinterface的使用
26.1.2ActionScript与JavaScript交互 566 26.1.3ActionScript与桌面程序交互 567 26.2网页脚本交互示例 568 26.3桌面应用交互示例 571 26.4小结 573 第27章ActionScript打印控制 574 27.1使用打印作业对象 574 ...
本例通过flash 8的ExternalInterface实现了javascript与flash之间的相互调用
Added setFlashCallObject and setFlashCallListener methods to support the Flash ExternalInterface.call functionality (requires Flash 9 or greater) - Added callFunction method which can call Flash ...