FB init函数给出错误的版本错误

我正在使用Facebook JS SDK,今天我创build了一个新的应用程序。 一切都正确configuration。 使用init函数,如:

window.fbAsyncInit = function() { FB.init({ appId : 'xxxx', // App ID status : false, version: 'v2.0', cookie : true, xfbml : false // parse XFBML }); }; (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/pl_PL/sdk.js"; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk')); 

但我有一个错误:“未捕获的错误:init没有调用有效的版本”也尝试其他版本,如:2.1,2.2,仍然没有运气。 我在这里做错了什么?

**免责声明 – 这纯属猜测。 似乎已经解决了我的问题。


我在最近的一个项目上遇到了这个问题。 我认为这是一个延迟问题。 Facebook SDK要求页面上有<div id="fb-root"></div> 。 这应该是开幕主题标签之后的第一件事。 在此之后,您可能会看到您的初始化代码。

对我而言,这个问题并不一致。 我偶尔会看到这个bug,有时我不会。 因此,我的结论是延迟问题。 如果SDK无法findfb-root ,则必须创build一个。 在此,我认为存在延迟问题。

尝试添加这个刚刚打开身体标记之后,但在你的FB.init({});

 <div id="fb-root"></div> 

这似乎已经解决了我的问题,并希望可以帮助其他人。 v1.0文档讨论了fb-root的原因,但是v2.0文档没有提到这个项目,可能是因为如果init脚本找不到它,init脚本就会添加它。

我通过使用all.js而不是sdk.js工作。
在你的情况下,它会看起来像:

 js.src = "//connect.facebook.net/pl_PL/all.js"; 

代替

 js.src = "//connect.facebook.net/pl_PL/sdk.js"; 

&version=v2.0添加到js.src中,如下所示:

 (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/sdk.js#xfbml=1&version=v2.0"; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk')); 

我取代了这个

 js.src = "//connect.facebook.net/en_US/sdk.js"; 

有了这个

 js.src = "//connect.facebook.net/en_US/all.js"; 

和工作:)

这个问题困扰了我一会儿。 我尝试了许多这里列出的想法,例如更改版本号和移动/删除fb-root

最后,对我来说,最好的办法是删除整个window.fbAsyncInit函数,并在sdk.js的散列中指定init属性。 例如:

 <script type="text/javascript"> (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 = "https://connect.facebook.net/en_US/sdk.js#version=v2.2&appId=12345&status=true&cookie=true&xfbml=true"; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk')); </script> 

当然,你可以省略一个参数来使用它的默认值。

我无法在任何地方find这种方法,所以使用它需要您自担风险。 幸运的是,我正在将一个较旧的网站从v1.x升级到v2.x并在加载all.js时使用了这种技术。

这是唯一能够在100%的时间内消除错误的解决scheme。

你可以通过删除你的FB.init来重新创build这个错误。 这证实虽然sdk.js已经加载并且FB命名空间已经存在,但当我们试图在我们脚本的其他地方使用FB方法的时候FB.init还没有被调用。

所以我们需要确保FB.init被调用。 我用类似的方法来回答这个问题 :

 if (typeof(fbApi) === 'undefined') { fbApi = {}; } fbApi = (function () { var fbApiInit = false; var awaitingReady = []; var notifyQ = function() { var i = 0, l = awaitingReady.length; for(i = 0; i < l; i++) { awaitingReady[i](); } }; var ready = function(cb) { if (fbApiInit) { cb(); } else { awaitingReady.push(cb); } }; window.fbAsyncInit = function () { FB.init({ appId : '<?php echo esc_js( $facebook_app_id ); ?>', status : true, cookie : true, xfbml : true, version: 'v2.0' }); fbApiInit = true; notifyQ(); }; return { /** * Fires callback when FB is initialized and ready for api calls. */ 'ready': ready }; })(); (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/sdk.js"; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk')); 

然后,在其他地方,任何对FB的引用都可以这样做:

  fbApi.ready(function() { FB.XFBML.parse($("#fb-comments")); }); 

这种情况也发生在我身上,而且很不一致。 在我的预感的某处,这是一个时机问题。 进一步debugging,通过手动执行“ FB.login() ”在开发人员控制台中发现错误。 错误说:“ 不用有效的版本调用init ”。

在我的情况下,我在html页面的标题中添加了//connect.facebook.net/en_US/sdk.js作为脚本标记,而window.fbAsyncInit刚刚在另一个文件中。 这指出我是一个计时问题,因此我交换了这两个脚本标记。 现在,在包含//connect.facebook.net/en_US/sdk.js之前,我已经包含了window.fbAsyncInit ,问题就没有了。 希望这可以帮助别人。

试试这个代码:

 setInterval( function() { FB.api('/me/', function(r) { console.log('response: ', r); }) }, 5000); 

我注意到,当我试图让信息FB仍然没有初始化。

我通过添加我的初始化代码来修复它:

 FB.getLoginStatus(function(response) { init(); }); 

我解决了这个错误,通过加载脚本文件准备,而不是文件加载。

例如,这给了10%的时间错误:

 $(window).load(function(){ (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/sdk.js"; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk')); }); 

而这一直在工作:

 $(window).ready(function(){ (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/sdk.js"; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk')); }); 

初始化之后当你调用FB api的时候要注意。 初始化似乎是同步的,但window.fbAsyncInit不是,所以你必须等待它的执行。 我的例子重现是在phonegap浏览器平台,但是当我检查facebook插件代码后,我确信它可以在纯javascript环境中转载。

这是我的代码,引发错误:

 if (window.config.debug_mode) { facebookConnectPlugin.browserInit('xxxxxxxxx', function() { }); } // getLoginStatus is wrong here as window.fbAsyncInit is not yet completed facebookConnectPlugin.getLoginStatus(function(status) { alert('logged: ' + JSON.stringify(status)); }, function(error) { alert('error: ' + JSON.stringify(error)); }); 

这是我如何解决它:

 if (window.config.debug_mode) { facebookConnectPlugin.browserInit('xxxxxxxxx', function() { facebookConnectPlugin.getLoginStatus(function(status) { alert('logged: ' + JSON.stringify(status)); }, function(error) { alert('error: ' + JSON.stringify(error)); }); }); } 

我确信下面的代码会抛出浏览器,但我没有时间来validation它:

 window.fbAsyncInit = function fbAsyncInit () { version = version || 'v2.6' FB.init({ appId: appId, xfbml: false, version: version }) } // now calling any FB function here will rise this error 

我们使用我们自己的API来做到这一点:

  _loadFacebookApi: function(callback) { logger.info('_loadFacebookApi'); (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 = "https://connect.facebook.net/en_US/sdk.js"; }(document, 'script', 'facebook-jssdk')); var fbScript = window.document.getElementById('facebook-jssdk'); fbScript.onload = fbScript.onreadystatechange = (function() { logger.info('fbScript onLoad'); window.FB.init({ version: 'v2.1', appId: '', channelUrl: '/fbchannel.html', status: false, cookie: true, xfbml: true, logging: true, oath: true }); this.dispatch(constants.FACEBOOK_INIT_SUCCESS); if(callback){ callback(); } }.bind(this)); } 

当我试图在写一篇文章中embedded一个简单的Facebook文章时,我遇到了同样的问题。

 <div id="fb-root"></div><script>(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/sdk.js#xfbml=1&amp;version=v2.3"; fjs.parentNode.insertBefore(js, fjs);}(document, 'script', 'facebook-jssdk'));</script><div class="fb-post" data-href="https://www.facebook.com/feyenoord/posts/10153224326681816:0" data-width="500"><div class="fb-xfbml-parse-ignore"><blockquote cite="https://www.facebook.com/feyenoord/posts/10153224326681816:0"><p>Een teleurstellende middag in De Kuip. Ook ADO Den Haag bleek vanmiddag te sterk voor Feyenoord. http://bit.ly/1UA3ZxZADO Den Haag too strong for Feyenoord. http://bit.ly/1UA6rEN</p>Posted by <a href="https://www.facebook.com/feyenoord/">Feyenoord Rotterdam</a> on&nbsp;<a href="https://www.facebook.com/feyenoord/posts/10153224326681816:0">Sunday, January 31, 2016</a></blockquote></div></div> 

当我debuggingFacebook sdk.js我看到.getVersion返回“undefined”,因此不呈现窗口小部件。

显然,Facebook无法处理由&amp;分隔的传递查询参数&amp; 而不是&当加载sdk.js 我已经将我的代码更改为&amp; 为了validation的原因。

 Works: js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.3"; Doesn't Work: js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&amp;version=v2.3"; 

Facebook的SDK调试getVersion

每次我redirect到一个带有fb页面插件的页面(Edge浏览器)时,都会发生错误。

如果我刷新页面,它将工作。 如果我通过超链接到达那里,会抛出错误。

通过在脚本中添加sdk.js?d=" + new Date().toISOString();

 (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/sdk.js?d=" + new Date().toISOString(); fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk')); 

您正在使用cordova-plugin-facebook4插件,这是一个自定义错误消息,这意味着当调用facebook api函数时,init尚未完成。 由于插件没有给出使用setTimeout的waitForInitialize ,然后重试api方法是最好的select。

 var retryFunc = (iteration) => { return new Promise((s, f) => facebookConnectPlugin.getLoginStatus(s, f)) .then(authentication => authentication.status === 'connected') .then(isLoggedIn => { /* Your Code Here */ }) .catch(failure => { console.log(`Waiting for Facebook Init. Iteration: ${iteration || 0}`); if((iteration || 0) < 10) { return new Promise((s, setTimeout(() => s(), 1000) .then(() => retryFunc(null, (iteration || 0) + 1); } else { return Promise.reject({Error: 'Failed to check login status.', Detail: failure}); } }); }; retryFunc(); /* Or replace getLoginStatus with your api call. */ 
  • 错误信息
  • 附加信息

单一包含 – 确保Facebook JavaScript API不会在您的页面上多次包含。

(这是我的问题)

 window.fbAsyncInit = function() { FB.init({ appId : 'xxxx', // App ID status : false, version: 'v2.0', cookie : true, xfbml : false // parse XFBML }); }; 

有错误版本:'v2.0',这是无效的代码