我正在构建facebook iframe app。我的应用程序加载一次(我收到signed_request一次),然后使用内部域链接浏览iframe中的页面。我注意到我在Chrome和Firefox中看到了这些奇怪的消息
FB.init has already been called - this could indicate a problem
我很确定这种方法只被调用一次,而且似乎Facebook要求我在每次应用程序加载时调用一次(不是每页一次)。
window.fbAsyncInit = function() {
FB.init({
appId: param('facebook_app_id'),
frictionlessRequests: true,
oauth: true,
channelUrl: site_url('/channel.html')
})
}
我在这里犯了什么错误(如果有的话)?
答案 0 :(得分:156)
从您将参数传递到像js.src
这样的#xfbml=1&appId=X
的那一刻起,FB SDK将自动初始化,因此FB.init
将尝试重新启动..
因此,在您的代码中,您不必删除FB.init
函数,只需确保不要在异步加载JS SDK的代码中传递参数。
替换它:
js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&appId=X";
使用:
js.src = "//connect.facebook.net/en_US/sdk.js";
希望这有帮助。
答案 1 :(得分:10)
如果你真的需要多次调用init,你可以这样做:
FB._initialized = false;
FB.init();
但这对我没有意义,我有一点点不同的问题,但它也与FB.init has already been called - this could indicate a problem
消息有关。
我有基于AJAX的网站,每次加载页面后,我需要从HTML中呈现XFBML,这是我从AJAX请求中获取的(注释,如按钮和其他):
<div class="fb-comments" data-href="{REMOVED}" data-num-posts="5" data-width="760" colorscheme="dark"></div>
为此,您可以在需要渲染XFBML时运行它:
FB.XFBML.parse();
答案 2 :(得分:0)
我也遇到过这个问题。我只是删除了FB.init({...})
部分,它开始使用以下代码:
window.fbAsyncInit = function () {
FB.Event.subscribe('auth.logout', function () {
// subscribe parts
});
// here is where fb.init() code was
};
(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/all.js#xfbml=1&appId=X";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
我猜它现在自动进入代码,因此无需手动执行。现在我的代码再次运行。我希望这会有所帮助。