【发布时间】:2011-01-31 23:52:48
【问题描述】:
总结
我希望能够使用 ExternalInterface 从 Flex 应用程序调用 JavaScript 函数,并将对不同 JavaScript 函数的引用作为参数传递。
基本示例
给定以下 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();" />
动作脚本:
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"]();
}
);
注意:
- 将字符串作为参数传递给 ExternalInterface 调用会导致 FB 的 JS 基本上尝试执行 `"onBookmarkDialogClosed"()`,这不用说是行不通的。
- 将函数作为参数传递会在另一端产生一个函数对象(可通过 `typeof` 确认),但它似乎是一个空函数;即`function Function() {}`
【问题讨论】:
标签: javascript actionscript-3 facebook externalinterface