[转]ExternalInterface与页面交互的两个Bug总结

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直接设置数据。

你可能感兴趣的:(JavaScript,浏览器,IE,Flash,firefox)