2013-03-10 56 views
0

在我的网站上,我检查当前用户是否已经喜欢它的粉丝页面。如果不是,我会显示一个粉红色的箭头作为提示。Facebook的JS API在隐藏标签中的行为不同

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

用于检测的方法是以下的(称为上$(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复制。

+0

你能围绕这个调用添加代码吗?你在window.fbAsyncInit中运行它吗?你是否等待window.fbAsyncInit完成? – Eldar 2013-03-10 14:16:40

+0

完成。我不知道如何注册完成初始化事件......顺便说一句,init是在别处完成的,我只是试图避免重新初始化... – 2013-03-10 14:21:15

回答

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); 
     } 
    }); 
}); 
0

这并不重要的标签是在brwoser视口可见,你应该把功能showLikeHint一个$(window).load内,thets什么,我会做,当HTML文件被加载和DOM准备$(document).ready()被调用,$(window).load当完整的页面被完全加载时被调用,包括所有的框架,对象和图像,希望这可以帮助你。

+0

我其实已经尝试过。但是,我不会工作。回调函数从来没有达到,切换到'$(document).load()'或'$(body).load()'也没有帮助... – 2013-03-10 14:33:31