2010-09-27 77 views
0

我想從Flash調用Javascript函數,我可以用ExternalInterface執行該函數,但JavaScript函數需要回調。有沒有辦法給它一個Flash回調?在ExternalInterface中傳遞迴調

我認爲是這樣的:

ExternalInterface.addCallback("foo", function(){...}); 
ExternalInterface.call("theFunction", "foo"); 

但是,這是行不通的,因爲theFunction將嘗試做foo(),而應該真正做到swfObject.foo()。問題是頁面和它的Javascript不受我控制(儘管如果真的需要,我可以請求更改)。

回答

3

這與first question in the related questions section密切相關。

按照同樣的思路爲回答這個問題,你可以這樣做:

ExternalInterface.addCallback("foo", function() { /* ... */ }); // The callback 
ExternalInterface.call("theFunction(function() { swfObject.foo(); })"); 
1

我想,你誤解了文檔。 callback在這個實例中只是對Flash中的函數的引用,而不是對您調用的某個回調的回調。

基本上,你用.call()來調用AS的JS函數;並且您使用.addCallback()來告訴Flash Player應該根據名稱調用哪個AS函數。

在你的例子中,theFunction會得到一個參數爲'foo',它是引用你的匿名AS函數的名字。不知道爲什麼你想要通過這樣的功能,但如果需要,你可以只用

function theFunction(callback) { 
    // .. do something... 
    swfObject[callback](); 
} 

把它從JavaScript現在,如果你沒有在JS/HTML側控制,我我不確定你是否可以這樣做。不知道爲什麼你需要,無論如何 - JS調用是同步的,就好像它們在同一個線程上運行一樣,這意味着Flash Player將執行JS代碼,然後返回到Flash Player ...您沒有等待執行或任何事情。

此外,如果你真的需要控制頁面不接觸JS/HTML的一面,記得您可以通過.call注入的JS代碼全部作品 - 它並不需要一個簡單的函數調用。您可以從SWF內部創建整個功能。例如,

var js:XML = <script><![CDATA[ 
    // Javascript code... 
]]></script>; 
ExternalInterface.call(js); 

或者,如果你需要的數據,你並不需要一個回調或者 - 只是做一個簡單的通話中

// JS 
function isNumberZero(__num) { 
    return __num == 0; 
} 

// AS 
trace ("Is number zero = " + ExternalInterface.call("isNumberZero", 10)); 

不知道這是否有助於在所有。如果沒有,那麼有更多關於你想要做什麼的信息是很好的。

+0

謝謝,但我明白ExternalInterface的是如何工作的(當然,除非你可以在頁面中插入新的JavaScript,這是新信息)。我試圖濫用addCallback來進行實際的回調,我確實需要這樣做,因爲Javascript函數會執行異步的Internet請求。無論如何,我們現在可以控制HTML/JS方面。 – 2010-09-27 19:37:13