2011-01-10 139 views
8

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

任何想法?

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

回答

5

我也有同样的麻烦。第二天寻找解决方案。而刚刚找到一个办法: 关闭活跃FB对话框,您应该在父窗口中执行代码被跟随哪里FB JS可何FB.ui被称为:

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

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

1)设置目标attr的,是 “_self”:

目标= “_自我”

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

3)刚刚创建网址的设置动作ATTR:

行动=“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> 

UPDATE:

5)有一个问题别人这样: FB IFRAME通过HTTPS加载,但如果请求的形式“行动” ATTR用途的“http” - 用户将获得浏览器的警告。但是,如果请求表单'action'具有'https' - iframe js无法访问'http'加载的父代。 因此,它为什么要通过的“https”

希望用行动的原因,这有助于

如果你有更好的解决方案,也可以改善这种方式 - 请让都知道这一点, 感谢您的任何意见

+2

我收到消息“FB.Dialog.remove的方法没有得到官方的支持,并且很快就会被删除。”当我使用FB.Dialog.remove时,在控制台上。所以不建议使用它。 – FR6 2012-08-21 14:08:24

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> 
0

我发现伊戈尔尼科夫的答案没有工作,但只有当我确定申报两个页面 - 使用document.domain的相同的域的一部分 - 在打开的对话框和close_dialog.html的一个。所以在这两个页面的脚本标签的顶部you'ld不得不加入这一行

document.domain = 'mysite.com'; 

显然与以往您的域名是什么

0

的FB.ui提供了一个选项用于替换mysite.com回调函数将在FB.ui完成后执行。

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

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

+0

他不需要回调,他想以编程方式关闭对话框 – luschn 2013-07-12 13:46:45

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(); 
     } 
    } 
    } 
} 
0

FWIW访问从关闭对话框上班,我的浏览器的隐私插件是防止FB。我刚刚关闭隐私插件,并按预期关闭了对话框。

相关问题