摘要
我希望能夠使用ExternalInterface從Flex應用程序調用JavaScript函數,並將引用傳遞給不同的JavaScript函數作爲參數。如何將引用傳遞給JS函數作爲ExternalInterface調用的參數?
基地例
考慮下面的JavaScript:
function foo(callback)
{
// ... do some stuff
callback();
}
function bar()
{
// do some stuff that should happen after a call to foo
}
我想調用使用ExternalInterface的從我的Flex應用程序foo
並傳遞一個參考bar
作爲回調。
爲什麼
真的,foo
不是我的函數(,而是FB.Connect.showBookmarkDialog
),這是由於在Facebook上的iframe的應用程序的限制只能在點擊一個按鈕來調用。由於設計原因,我的按鈕位於Flex應用程序中。幸運的是,可以撥打ExternalInterface.call("FB.Connect.showBookmarkDialog", callback)
來顯示書籤對話框。但是,FB.Connect.showBookmarkDialog
需要一個JS回調,所以,如果我想要接收回調(我這樣做),我需要傳遞一個JS函數的引用作爲單個參數。
實例
MXML:
<mx:Button click="showBookmarkDialog();" />
的ActionScript:
function showBookmarkDialog() : void
{
ExternalInterface.registerCallback(
"onBookmarkDialogClosed",
onBookmarkDialogClosed
);
ExternalInterface.call(
"FB.Connect.showBookmarkDialog",
/* ref to JS function onBookmarkDialogClosed ? */
);
}
function onBookmarkDialogClosed(success:Boolean) : void
{
// sweet, we made it back
}
JavaScript的:
function onBookmarkDialogClosed()
{
var success;
// determine value of success
getSWF().onBookmarkDialogClosed(success);
}
個失敗的實驗 我已經試過......
ExternalInterface.call(
"FB.Connect.showBookmarkDialog",
"onBookmarkDialogClosed"
);
ExternalInterface.call(
"FB.Connect.showBookmarkDialog",
onBookmarkDialogClosed
);
ExternalInterface.call(
"FB.Connect.showBookmarkDialog",
function() : void
{
ExternalInterface.call("onBookmarkDialogClosed");
}
);
ExternalInterface.call(
"FB.Connect.showBookmarkDialog",
function()
{
this["onBookmarkDialogClosed"]();
}
);
值得注意的是:
- 傳遞一個字符串作爲參數傳遞給在FB的JS ExternalInterface調用結果基本要做`「onBookmarkDialogClosed 「()`不用說,不會奏效。
- 將函數作爲參數傳遞會導致另一方的函數對象(可以用`typeof`確認),但它似乎是一個空函數;即,`函數功能(){}`