防止阻止使用facebook SDK显示的弹出窗口

时间:2012-03-23 15:27:03

标签: javascript facebook popup

在阻止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,则此条件(if(response.status ===)返回false。浏览器将 BLOCK 弹出窗口,将由FB.login显示。有什么方法可以阻止这种情况吗?

1 个答案:

答案 0 :(得分: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' });
    }
}