【问题标题】:How to close a facebook SDK dialog opened with FB.ui()?如何关闭使用 FB.ui() 打开的 facebook SDK 对话框?
【发布时间】:2011-01-10 11:43:15
【问题描述】:

我正在成功显示邀请朋友对话框(代码如下所示)。当用户单击跳过 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

【问题讨论】:

    标签: javascript facebook facebook-javascript-sdk


    【解决方案1】:

    我也有同样的烦恼。第二天寻找解决方案。刚刚找到了一种方法: 要关闭活动的 FB 对话框,您应该在 FB JS 可用且调用 FB.ui 的父窗口中执行以下代码:

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

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

    1) 将 and 的目标属性设置为“_self”:

    target="_self"

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

    3) 设置刚刚创建的url的action attr:

    action="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 iframe 由 https 加载,但如果 request-form 'action' attr 使用 'http' - 用户将收到浏览器警告。但是,如果请求表单“操作”具有“https”-iframe js 无法访问由“http”加载的父级。 所以,这就是你应该使用'https'操作的原因

    希望对你有帮助

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

    【讨论】:

    • 我收到消息“FB.Dialog.remove 方法不受 Facebook 官方支持,很快将被删除。”当我使用 FB.Dialog.remove 时在控制台上。所以不建议使用。
    【解决方案2】:

    那行不通(至少对我来说不行)。

    我所做的只是调用 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>
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 他不需要回调,他想以编程方式关闭对话框
      【解决方案4】:

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

      document.domain = 'mysite.com';
      

      显然将 mysite.com 替换为您的域名

      【讨论】:

        【解决方案5】:

        这会关闭所有对话框,但由于访问内部变量_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();
              }
            }
          }
        }
        

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 2017-05-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-11-10
            • 2012-02-17
            • 2012-02-15
            • 1970-01-01
            相关资源
            最近更新 更多