在移动Web应用中,FB.login()弹出窗口被阻止。

3
我们的移动Web应用程序使用Facebook Javascript SDK,我们希望检查用户的登录状态,并在需要时显示Facebook登录对话框。以下代码在我们Web应用程序中特定按钮的点击处理程序内运行:
$('#button').click(function() {
    FB.getLoginStatus(function(response) {
        if (response.status === 'connected') {
            // do something with the logged in and authorized user
        } else if (response.status === 'not authorized') {
            // logged in but has not authorized our app
        } else {
            // not logged in
            FB.login();
        }
    });
});

确保用户未登录Facebook,这在桌面Web浏览器上按下按钮时可以正常工作并显示登录对话框,但在移动Web上无法正常工作(至少在Android上的各种浏览器上无法正常工作,我目前没有iPhone)。在移动Web应用程序上没有任何内容显示,当我禁用弹出窗口拦截器时,就会出现提示询问是否允许此弹出窗口,这是有效的。
有人知道为什么行为不同和/或已知/标准解决方法吗?谢谢!
1个回答

7

您的代码将无法在所有桌面浏览器上正常运行。一些浏览器(移动端和桌面端)除非是由用户点击启动弹出窗口,否则会阻止它们的出现。例如:

$('#mybutton').click(function() {
   FB.login();
});

这段代码可以正常工作,因为FB.login()函数仅在响应用户单击时调用。所以要修复您的代码,请用一些显示“登录”按钮和鼓励用户单击该按钮的文本替换FB.login()调用。


嗨Gil,感谢您的回复。我正在更新代码,因为我忘记指定代码是在响应用户点击时调用的。如果用户单击触发一个AJAX调用(FB.getLoginStatus),其响应会触发实际的弹出窗口(FB.login),那么这会如何影响弹出窗口阻止? - aarontam
我之前说的仍然适用。由于您是从回调函数中调用FB.login(),因此浏览器认为它与用户的点击操作分开。 - Gil Birman
明白了。如果可能的话,我们正在尝试避免用户再次点击另一个按钮,因此我将探索另一种改进此流程的方法。 - aarontam
在页面加载时调用getLoginStatus(),这样当用户点击按钮时,你已经知道了状态。 - Gil Birman
哈哈,我刚刚做了那个更改,谢谢!如果我想要做其他事情,比如在用户点击其中一个按钮后启动FB对话框,但必须先进行AJAX调用以检索动态(基于他们按下的按钮)消息文本,该怎么办? - aarontam
在页面加载时获取所有Ajax内容 ;) 但说真的,让用户点击两次并不一定是件坏事。我相信有些情况下,如果你在实际显示授权对话框之前警告用户即将出现,他们会更倾向于点击它,而不是在没有警告的情况下强行推送给他们。很多人已经被训练成讨厌弹出窗口了。我认为Facebook正在改变这种情况,但仍存在某种污名。 - Gil Birman

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