![](/img/trans.png)
[英]How to use Facebook PHP Access Token with FB Javascript SDK for FB.UI dialog
[英]How to close a facebook SDK dialog opened with FB.ui()?
我正在成功显示邀请朋友对话框(代码如下所示)。 当用户点击跳过时,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论坛上发布了相同的问题而没有回复。我会更新两者,如果有答案的话。)
Javascript代码是从堆栈溢出答案改编而来的。
我遇到同样的麻烦。 第二天寻找解决方案。 并且只找到一种方法:为了关闭活动的FB对话框,你应该在父窗口中执行跟随代码,其中FB JS可用并且调用了FB.ui:
FB.Dialog.remove(FB.Dialog._active);
因此,如果您希望邀请对话框自动关闭并且不重定向到任何其他页面,请使用以下步骤:
1)设置目标attr为和“_self”:
TARGET = “_自我”
2)在您的网站上创建一些回调网址/页面,例如https://mysite/close_dialog.html
3)将动作attr设置为刚创建的url:
行动= “HTTP://mysite/close_dialog.html”
4)在你的close_dialog.html put中跟着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加载,但如果请求表单'action'attr使用'http' - 用户将收到浏览器警告。 但是,如果请求表单'action'具有'https' - iframe js无法访问由'http'加载的父级。 所以,它之所以你应该使用'https'的行动
希望这可以帮助
如果您有更好的解决方案或者您可以改进这种方式 - 请让所有人知道这一点,感谢您的任何意见
这不起作用(至少不适合我)。
我所做的只是调用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>
FB.ui提供了一个回调函数选项,该函数将在FB.ui完成后执行。
FB.ui(
{
method: '..........',
..................
},
function(response) {
//write your code here
}
);
这有助于解决您的问题吗?
这将关闭所有对话框,但由于访问内部变量_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();
}
}
}
}
FWIW,我的浏览器的隐私插件阻止FB关闭对话框。 我刚刚关闭了隐私插件,对话框按预期关闭了。
我发现Igor Reshetnikov的答案确实有效,但前提是我确保声明这两个页面 - 打开对话框和close_dialog.html - 使用document.domain作为同一域的一部分。 所以在两个页面的脚本标签的顶部你必须添加这一行
document.domain = 'mysite.com';
显然用你的域名替换mysite.com
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.