3

总结
我希望能够使用 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
}

我想foo使用 ExternalInterface 从我的 flex 应用程序调用,并将引用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"]();
    }
);

注意:

  1. 将字符串作为参数传递给 ExternalInterface 调用会导致 FB 的 JS 基本上尝试执行“onBookmarkDialogClosed”(),这不用说是行不通的。
  2. 将函数作为参数传递会在另一侧产生一个函数对象(可通过 `typeof` 确认),但它似乎是一个空函数;即`function Function() {}`
4

1 回答 1

1

与往常一样,人们只需要问一个问题就可以得到答案……

解决方案

ExternalInterface.call("FB.Connect.showBookmarkDialog(onBookmarkDialogClosed)");
于 2010-03-26T00:14:08.857 回答