如何关闭用FB.ui()打开的facebook SDK对话框?

时间:2011-01-10 11:43:15

标签: javascript facebook facebook-javascript-sdk

我正在成功显示邀请朋友对话框(代码如下所示)。当用户点击跳过时,iframe /对话框会显示新页面。但是从这一点来说,我找不到如何关闭iframe /对话框的方法。 FB.ui不返回任何对象,似乎没有Javascript SDK方法,并且使用DOM遍历和操作将对任何FB代码更改都很脆弱。

有什么想法吗?

function popupInviteForm(actionUrl) {
    var fbmlString = '<fb:fbml>' +
              '   <fb:request-form type="POST" content="Play against me in game?" action="' + actionUrl + '" method="post" >' +
              '       <fb:multi-friend-selector target="_self" exclude_ids="" max="20" cols="4" rows="3" showborder="false" actiontext="Invite friends!" />' +
              '   </fb:request-form>' +
              '</fb:fbml>';

    FB.ui({
        method: 'fbml.dialog',
        fbml: fbmlString,
        display: 'dialog',
        size: {width:640,height:480}, width:640, height:480
    });

    $(".FB_UI_Dialog").css('width', $(window).width()*0.8);
}

(注意:我在facebook forum上发布了相同的问题而没有回复。如果有答案,我会更新两者。)

Javascript代码改编自堆栈溢出answer

6 个答案:

答案 0 :(得分:5)

我遇到同样的麻烦。第二天寻找解决方案。刚发现一种方式: 要关闭活动的FB对话框,你应该在父窗口中执行跟随代码,其中FB JS可用并且调用了FB.ui:

FB.Dialog.remove(FB.Dialog._active);

因此,如果您希望邀请对话框自动关闭且不重定向到任何其他页面,请使用以下步骤:

1)将目标attr设为和“_self”:

  

目标= “_自”

2)例如,在您的网站上创建一些回调网址/页面  https://mysite/close_dialog.html

3)将动作attr设置为刚创建的url:

  

行动= “HTTP://mysite/close_dialog.html”

4)在你的close_dialog.html中跟随JS:

    <script type="text/javascript">
        if (document.location.protocol == 'https:') {
            document.location = 'http://mysite/close_dialog.html';
        } else {
            top.window.FB.Dialog.remove(top.window.FB.Dialog._active);
        };
    </script>

<强>更新

5)以这种方式还有一个问题: FB由ifps加载iframe,但如果请求表单'action'attr使用'http' - 用户将收到浏览器警告。但是,如果请求表单'action'具有'https' - iframe js无法访问由'http'加载的父级。 所以,它之所以你应该使用'https'

的行动

希望这有帮助

如果您有更好的解决方案或者您可以改进这种方式 - 请让所有人知道这一点, 感谢您的任何评论

答案 1 :(得分:3)

这不起作用(至少不适合我)。

我所做的只是调用javascript window.close();函数而不是top.window.FB.Dialog.remove(top.window.FB.Dialog._active);它有效。

<script type="text/javascript">
    if (document.location.protocol == 'https:') {
        document.location = 'http://mysite/close_dialog.html';
    } else {
        //alert('some message');
        window.close();
    };
</script>

答案 2 :(得分:0)

我发现Igor Reshetnikov的答案确实有效,但前提是我确保声明两个页面 - 打开对话框和close_dialog.html的页面 - 使用document.domain作为同一域的一部分。所以在两个页面的脚本标签的顶部,你必须添加这一行

document.domain = 'mysite.com';

显然用你的域名

替换mysite.com

答案 3 :(得分:0)

FB.ui提供了一个回调函数的选项,该函数将在FB.ui完成后执行。

FB.ui(
  {
    method: '..........',
    ..................
  },
  function(response) {
    //write your code here
  }
);

这有助于解决您的问题吗?

答案 4 :(得分:0)

这会关闭所有对话框,但由于访问内部变量_loadedNodes

,可能无法在将来的版本中使用
if (FB && FB.UIServer && FB.UIServer._loadedNodes) {
  var nodes = FB.UIServer._loadedNodes;
  if (nodes) {
    for (var item in nodes) {
      if (nodes[item].type && nodes[item].node && nodes[item].node.close &&
 nodes[item].type === "popup") {
        nodes[item].node.close();
      }
    }
  }
}

答案 5 :(得分:0)

FWIW,我的浏览器的隐私插件阻止FB关闭对话框。我刚刚关闭隐私插件,对话框按预期关闭了。