如何将对JS函数的引用作为参数传递给ExternalInterface调用?

时间:2010-03-26 00:00:15

标签: javascript actionscript-3 facebook externalinterface

摘要
我希望能够使用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();" />

的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"]();
    }
);

值得注意的是:

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

1 个答案:

答案 0 :(得分:1)

与往常一样,人们只需要问一个问题就可以揭示答案......

的解决方案

ExternalInterface.call("FB.Connect.showBookmarkDialog(onBookmarkDialogClosed)");