使用了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, "&").replace(/"<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'"); } 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,有谁知道,不妨指点一下。
没有评论:
发表评论