2011-06-18 79 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); 
    ... 
}