我有一個Javascript API,它應該可以與GWT和Flex一起使用。使用FABridge,從AS3調用Javascript方法非常簡單,反之亦然。但是,當我嘗試在我的Javascript API中註冊回調到AS3方法時,我卡住了。下面是一個簡短的代碼示例:從Javascript調用Flex/AS3回調
public function initApp():void {
if (ExternalInterface.available) {
ExternalInterface.addCallback("foobar", foobar);
}
}
public function foobar():void {
//the callback function
Alert.show("Callback from API works!");
}
private function btnCallbackClicked():void {
ExternalInterface.call("testAPICallbackFromJS", Application.application.foobar);
}
和簡單的JS方法:
function testAPICallbackFromGWT(callback){
$clinit_26(); //added by the GWT compiler
alert('callback to be launched 3 2 1');
callback();
}
但是這個版本不工作,因爲我總是在我的JS代碼收到一個空的功能。看起來FABridge正在削減其餘部分。 然後我嘗試了一種不同的方法。我寫了一個小的JS方法,它接受函數的名稱並從JS端創建回調。
registerFlexCallback = function(registerMethod, callback, id) {
/*
workaround to create a callback for an AS method, which can be called by Javascript
* registerMethod - Javascript method which shall be called for registration with the created callback as parameter
* callback - AS method that shall be called by Javascript (available over the FABridge interface)
* id - ID of the flash object (use Application.application.id in AS)
*/
var swf = document.getElementById(id);
eval(registerMethod + "(swf." + callback + ");");
};
這一個適用於Internet Explorer,但沒有其他瀏覽器。例如,在Firefox中,我得到了以下錯誤消息:
NPMethod called on non-NPObject wrapped JSObject!
有人可以告訴我,這是什麼錯誤是關於(也許某種安全問題的)?或者有沒有人有一個更好的主意,如何創建可以由JS調用我的AS3方法的回調?
非常感謝您的幫助,它現在正常運作!只有兩件事,如果您使用UIDUtil.createUID()創建JS函數名稱,則應在開頭添加一個字母並替換全部「 - 」,否則它似乎不是正確的JS函數名稱,也不會工作。另外我還需要在我的JS代碼中調用函數名,因爲它只是一個字符串而沒有函數指針。有一個更好的方法嗎? – SilentGert 2009-09-29 00:17:11
好的一點,關於JS中的方法名稱。實際上,我並沒有使用UUID,但是,這是我所能想到的!你可以直接在JS中通過名稱調用它們的函數,如下所示: this [functionName] .apply(arrayOfParameters); 但使用eval沒有多大區別。 – dan 2009-09-29 14:21:31