防止使用 Facebook SDK 出现的弹出窗口被阻止

4

我遇到了一个问题,无法阻止Facebook JS SDK弹出的弹窗。在阅读文档后,我了解到必须在用户单击后调用JS SDK。下面这段代码可以正常工作,浏览器不会阻止弹出窗口:

function Login() {
    FB.login(function (response) {
        if (response.authResponse) {
            DoSmth(response.authResponse.accessToken);
        }
    }, { scope:'user_birthday, publish_stream' });
}

但是,如果我将这段代码用在任何地方(例如发布到墙上、获取用户数据),那么这个弹出窗口将总是显示,即使用户已经在Facebook上登录了。我认为,这并不好。

为了确定用户是否已经登录,我使用了以下代码:

function CheckOrLogin() {
    FB.getLoginStatus(function (response) {
        if (response.status === 'connected') {
            DoSmth(response.authResponse.accessToken);
        }
        else {
            FB.login(function (response) {
                if (response.authResponse) {
                    DoSmth(response.authResponse.accessToken);
                }
            }, { scope:'user_birthday, publish_stream' });
        }
    }, true);
}

在这种情况下,如果用户已经登录,则不会显示弹出窗口。但是如果用户尚未登录Facebook,则此条件(如果(response.status ===)返回false。并且浏览器将阻止由FB.login显示的弹出窗口。有没有办法防止这种情况发生?


我也遇到了同样的问题 :/ - Multitut
1个回答

0
尝试在页面加载时立即检查登录状态,并将结果和accessToken存储在某个变量中。
var userData = {isConnected: false, token: null};
FB.getLoginStatus(function (response) {
    userData.isConnected = (response.status === 'connected');
    if (userData.isConnected) {
        userData.token = response.authResponse.accessToken;
    }
}, true);

当用户点击某个按钮时,只需检查变量的值。
function CheckOrLogin() {
    if (userData.isConnected) {
        DoSmth(userData.token);
    } else {
        FB.login(function (response) {
            if (response.authResponse) {
                DoSmth(response.authResponse.accessToken);
            }
        }, { scope:'user_birthday, publish_stream' });
    }
}

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