2007年6月4日

使用了ExternalInterface的swf在ie中如果id中有点(.)将会报错。

swf using ExternalInterface in IE, if there is dot(.) in it's id, IE will be fired error.

这几天研究flash flv player,发现了似乎bug的东西,前几天或者说是更早的时候我发现当swf使用了ExternalInterface接口和javascript通信的时候,在ie中如果id中有点(.)将会报错,ie则会报错,通过vs2005跟踪到以下代码:

__flash__removeCallback(nebula.player.FLVPlayer, "_stop");

这是其一。 在调用通信接口时会看到:

function __flash__arrayToXML(obj) {
 var s = "<array>";
 for (var i=0; i<obj.length; i++) {
  s += "<property id=\"" + i + "\">" + __flash__toXML(obj[i]) + "</property>";
 }
 return s+"</array>";
}
function __flash__argumentsToXML(obj,index) {
 var s = "<arguments>";
 for (var i=index; i<obj.length; i++) {
  s += __flash__toXML(obj[i]);
 }
 return s+"</arguments>";
}
function __flash__objectToXML(obj) {
 var s = "<object>";
 for (var prop in obj) {
  s += "<property id=\"" + prop + "\">" + __flash__toXML(obj[prop]) + "</property>";
 }
 return s+"</object>";
}
function __flash__escapeXML(s) {
 return s.replace(/&/g, "&amp;").replace(/"&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
}
function __flash__toXML(value) {
   var type = typeof(value);
 if (type == "string") {
  return "<string>" + __flash__escapeXML(value) + "</string>";
 } else if (type == "undefined") {
        return "<undefined/>";
 } else if (type == "number") {
        return "<number>" + value + "</number>";
 } else if (value == null) {
        return "<null/>";
 } else if (type == "boolean") {
        return value ? "<true/>" : "<false/>";
 } else if (value instanceof Date) {
        return "<date>" + value.getTime() + "</date>";
   } else if (value instanceof Array) {
       return __flash__arrayToXML(value);
   } else if (type == "object") {
       return __flash__objectToXML(value);
   } else {
     return "<null/>"; //???
 }
}
function __flash__addCallback(instance, name) {
  instance[name] = function () { 
    return eval(instance.CallFunction("<invoke name=\""+name+"\" returntype=\"javascript\">" + __flash__argumentsToXML(arguments,0) + "</invoke>"));
  }
}
function __flash__removeCallback(instance, name) {
  instance[name] = null;
}

这是其二,一般是在__flash__addCallback这个方法里报错, 一般是说instance没有定义。我的浏览器是IE6.0,flash player的版本是9,0,45,0,这个问题只有在IE中存在。

我们知道在IE里我们可以在JavaScript直接使用一个HtmlElement的Id来引用它而不用事先声明它或使用getElementById获取它,我想问题就存在这里了,当Id中存在点"."的时候,如果仍然这样引用显然会报错,比如在这个例子中会说"nebula未定义",从Adobe的代码似乎这样写的了。显然是无法将dom的带“点”的id直接声明成变量。

依我看,这应该是一个地地道道的bug。

我不知道如何submit或confirm Adobe的bug,有谁知道,不妨指点一下。

没有评论: