Facebook的JS API在隐藏选项卡中的行为有所不同

时间:2013-03-10 14:09:02

标签: javascript facebook facebook-graph-api browser

在我的网站上,我检查当前用户是否已经喜欢其粉丝页面。如果没有,我会显示一个粉红色箭头作为提示。

这在打开页面并等待加载所有内容时似乎正常工作。但是,如果我只输入地址,按回车并立即切换到另一个浏览器标签,我可以稍后再回来查找粉红色箭头,即使我已经喜欢粉丝页面。

检测方法如下(在$(document).ready()上调用):

function showLikeHint() {
    if (typeof FB === 'undefined') {
        setTimeout(showLikeHint, 100);
        return;
    }

    FB.api('/me/likes/339255156110755', {limit: 1}, function(r) {
        try {
            if (FB.getUserID() != "" && r.data.length == 1)
                iLikeFanpage();
            else
                iDontLikeFanpage();
        } catch (e) {
            setTimeout(showLikeHint, 200);
        }
    });
}

在隐藏选项卡中运行时,api(即FB对象)是否可能表现不同?我无法相信,但我不知道还有什么原因......

问题出现在http://lolkitten.org/上,可以使用最新的Chrome进行复制。

2 个答案:

答案 0 :(得分:0)

在brwoser视口中看到哪个选项卡无关紧要,你应该将函数showLikeHint放在$(window).load内,这就是我要做的事情,$(document).ready()在被调用时被调用加载HTML文档并准备好DOM,在完整加载完整页面时调用$(window).load,包括所有框架,对象和图像,希望这对您有所帮助。

答案 1 :(得分:0)

我发现了问题。如果用户尚未通过身份验证,则r.data将为undefined。我的解决方案如下:

FB.getLoginStatus(function (loginResponse) {
    if (loginResponse.status !== 'connected') {
        iDontLikeFanpage();
        return;
    }

    FB.api('/me/likes/339255156110755', {limit: 1}, function(r) {
        try {
            var likeData = r.data;
            if (typeof likeData === 'undefined') {
                setTimeout(showLikeHint, 200);
                return;
            }

            if (FB.getUserID() != "" && likeData.length == 1)
                iLikeFanpage();
            else
                iDontLikeFanpage();
        } catch (e) {
            setTimeout(showLikeHint, 200);
        }
    });
});