阻止弹出窗口被拦截

12

我在我的代码中使用了Facebook登录方法,但是当我执行这段代码时,弹出窗口阻止器会关闭Facebook权限窗口。

如何使用Javascript打开此窗口而不需要在弹出窗口阻止器中做出例外?

以下是我的代码:

FB.login(function(response)
{
    if(response.session!=null)
    {
        window.location.href='http://example.com';
    }
},
{ perms: 'email,user_birthday,publish_stream' });

有没有人有在iframe中显示Facebook权限弹出窗口的想法?这可能会解决弹出窗口阻止程序的问题。有吗? - Seema
请查看以下链接中的可能答案:http://stackoverflow.com/questions/11779955/can-you-call-fb-login-inside-a-callback-from-other-fb-methods-like-fb-getlogins/12851737#12851737 - sprockett
5个回答

20

你可以像这样实现 -

var uri = encodeURI('http://example.com');
FB.getLoginStatus(function(response) {
      if (response.status === 'connected') {
                window.location.href=uri;
      } else {
         window.location = encodeURI("https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri="+uri+"&response_type=token");
      }

这将直接重定向而不是打开弹窗


有趣,但是你在哪里请求特定权限,比如“{perms:'email,user_birthday,publish_stream'}”? - xus
1
在重定向的OAuth URI中,使用额外的GET参数'scope'。请查看https://developers.facebook.com/docs/reference/dialogs/oauth/。 - Rahul

15

文档明确禁止这样做:

“你只应该在用户事件上调用它,因为它会打开一个弹出窗口。大多数浏览器会阻止弹出窗口,除非它们是由用户事件引发的,例如单击按钮或链接。”

这也是糟糕的用户体验。


我强烈反对将此视为“简单的糟糕用户体验”。避免弹出窗口会更不显眼,尤其是在用户已经连接到Facebook的情况下,因为弹出窗口会迅速出现和消失。我认为,重定向进行oauth比打开弹出窗口更好的用户体验设计。 - thisguyheisaguy
不用在意我之前的评论...我的意思是关于用户发起的交互,我没有注意到原帖作者正在寻找一种通过Facebook秘密授权的方法。 - thisguyheisaguy

6

是的,您需要通过用户事件调用它,但严格来说只能使用 onclick 事件,其他事件不行:

<a href="#" onclick="fbLogin()"> Login</a> <!-- works -->

<a href="#" onmousedown="fbLogin()"> Login</a> <!-- doesnt work -->

<a href="#" onmouseup="fbLogin()"> Login</a> <!-- doesnt work -->

6

如果你可以绕过弹出窗口拦截器,那么它们就没有存在的意义了。你需要找到一种不使用弹出窗口的方法或者要求用户与浏览器交互才能打开弹出窗口。


我不想使用用户交互,因为在点击我的邀请链接后,被邀请者会进入我的主页,我想在没有任何用户交互的情况下显示Facebook权限弹窗。 - Seema

5
如果您尝试自动打开弹出窗口,则很可能会触发弹出窗口拦截器。据我所知,它必须基于某些用户操作,例如单击按钮。请尝试在单击按钮时执行此代码,它应该可以正常工作。

是的,Arnab!它可以通过点击事件处理,但我需要在页面加载时显示它。有什么想法吗??? - Seema
尝试使用document.getElementById('shareButtonId').click() - Piotr Kowalski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接