2011-06-18 53 views
1

我正在从javascript到我的swf上的方法进行回调。它在Firefox中工作没有问题,但在Chrome中传递的第二个参数总是被接收为空?在Chrome中的AS3 javascript回调问题

我调试了我的JavaScript,发现一切工作正常,传递给swf的两个值在swf的回调被创建的位置是正确的。

起初,我认为这可能是一个跨域问题,但已经裁定,如果是这样的话,那么swf上的方法根本就不会被调用。第二个值是图像的二进制字符串表示形式,并且传递的字符串的长度是101601,所以我想知道是否可以限制可传递的数据量?第一个参数是代表文件类型的小得多的字符串,并且它总是成功接收。

就像我说的,奇怪的是,它在Firefox中工作得很好吗?

注意 - 所以我刚刚尝试了一个更小的图像(愚蠢的是它没有发生过,我测试,直到我写这个),其中字符串长度只有133,它仍然失败。所以这规定了。

我也检查了AS3文档,它似乎没有提到任何这样的限制。

使用FileReader类的readAsBinaryString()方法生成字符串。据我所知,这输出一个UTF 16字符串表示它所接收的二进制文件。虽然我认为我认为这不应该成为问题,因为它仍然只是一个字符串,编码只会影响解码?

的Javascript

var readFile = function(file) 
{ 
    var reader = new FileReader(); 

    reader.onloadend = function(evt) 
    { 
     alert(reader.result.length);//this outputs the correct length 
     alert(reader.result); //this outputs the binary encoded as a String 

     swf.addImage(file.type, reader.result); 
    } 

    reader.readAsBinaryString(file); 
} 

AS3

ExternalInterface.addCallback("addImage", addImageHandler); 

private function addImageHandler(type:String, file:String):void 
{ 
    trace("type: ", type);//this traces the type correctly 
    trace("file: ", file);//this traces out null in chrome, but traces the binary string in firefox 
} 
+0

,如果你有一些代码,你可能会得到一个答案更快。希望你找到解决方案。 – Bemmu

+0

谢谢,希望这会有所帮助 – barry

+0

我已经回答了下面的问题 – barry

回答

0

当然没有一个代码示例,从您这可能不是在所有帮助,但在情况下,它可以:

这是我是如何从AS3调用JS函数说2个参数:

ExternalInterface.call("JavaScriptFunctionName", arg1_value, arg2_value); 

如果是这种JS功能:

function JavaScriptFunctionName(arg1, arg2) { ... 
+0

谢谢。我认为问题不在于回调被添加的方式,因为它在Firefox中正常工作,只是它似乎在Chrome中不起作用? – barry

1

所以似乎是一个问题与经过UTF-16编码字符串JavaScript的闪光,但只在铬?

我不确定为什么会出现这种情况,但是如果我在Javascript中将UTF-16字符串编码为base46或将其从UTF-16转换为UTF-8之前,我将它传递给swf ,那么一切都按预期工作。

编辑

在进一步的测试,该解决方案竟然是简单的比预期的,这只是呼吁UTF-16字符串是encodeURI,然后在另一端调用decodeURI的情况。

的Javascript

var reader = new FileReader(); 

reader.onloadend = function(evt) 
{ 
    swf.addImage(file.type, encodeURI(reader.result)); 
} 

reader.readAsBinaryString(file); 

AS3

private function dropHandler(type:String, file:String):void 
{ 
    file = decodeURI(file); 
    ... 
}