javascript - puede - La función de inicio de FB da error de versión incorrecta
microsoft office no puede abrir este archivo porque faltan algunas de sus partes (17)
Estoy usando Facebook JS SDK, y hoy he creado una nueva aplicación. Todo está configurado correctamente. Usando la función init como:
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''));
pero tengo un error: "Error no detectado: init no llamado con la versión válida" Estaba probando también otras versiones como: 2.1, 2.2 y todavía no tuve suerte. ¿Qué estoy haciendo mal aquí?
window.fbAsyncInit = function() { FB.init({ appId : ''xxxx'', // App ID status : false, version: ''v2.0'', cookie : true, xfbml : false // parse XFBML }); };
Hay una versión de error : ''v2.0'', Este no es un código válido
Asegúrate de estar usando https://
en la URL
js.src = "https://connect.facebook.net/en_US/sdk.js";
No hubiera creído esto tampoco, pero la única diferencia entre lo que Facebook tiene en su código de muestra actual y lo que tengo es https://
lugar de //
para la url.
La actualización es https: // parece haberlo solucionado y no puedo duplicar el error.
Además, si está realizando comprobaciones en otro lugar de su código para ver si está definido FB
asegúrese de verificar if (window.FB)
y no if (FB)
o obtendrá un error.
// call after manually adding DOM nodes containing FB widgets
if (window.FB)
{
window.FB.XFBML.parse()
}
Si usas mecanografiado, debes agregar algo como esto:
interface Window
{
FB: IFacebook;
}
interface IFacebook
{
XFBML: any;
ui: any;
getLoginStatus(callback: (response: { status: string }) => any);
login(callback: (response) => any, options: any);
logout(callback: () => any);
Event: any;
api(url: string, callback: (response: any) => any);
}
** Descargo de responsabilidad: esto es pura especulación. Parece que ha resuelto mi problema.
He tenido este problema en un proyecto reciente. Creo que este es un problema de latencia. El SDK de Facebook requiere que <div id="fb-root"></div>
esté en la página. Esto debería ser lo primero después de la etiqueta corporal de apertura. Después de esto, puede ver su código de inicialización.
Para mí, este problema no fue consistente. Ocasionalmente veía el error y otras veces no. Por lo tanto, mi conclusión de que es un problema de latencia. Si el SDK no puede encontrar la fb-root
, entonces debe crear una. Aquí, es donde creo que existe el problema de latencia.
Intente agregar esto justo después de su etiqueta de cuerpo de apertura, pero antes de su FB.init({});
.
<div id="fb-root"></div>
Esto parece haber resuelto el problema para mí y espero que ayude a otros también. La documentación de v1.0 trata el motivo de fb-root
, pero los documentos de v2.0 no hacen mención del elemento, probablemente porque el script de inicio lo agregará si no lo encuentra.
Agregue &version=v2.0
a js.src, de la siguiente manera:
(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''));
El error ocurrió cada vez que redirigí a una página (Explorador perimetral) que tenía un complemento de página fb.
Si actualicé la página, funcionaría. Si llegué allí a través de un hipervínculo arrojaría el error.
Se sdk.js?d=" + new Date().toISOString();
añadiendo sdk.js?d=" + new Date().toISOString();
al 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?d=" + new Date().toISOString();
fjs.parentNode.insertBefore(js, fjs);
}(document, ''script'', ''facebook-jssdk''));
Está utilizando el plugin cordova-plugin-facebook4, y ese es un mensaje de error personalizado que significa que el init no ha terminado cuando se llama a la función API de Facebook. Como el complemento no da un waitForInitialize
usando setTimeout y luego reintentar el método api es la mejor opción.
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. */
Esta fue la única solución que eliminaría el error el 100% del tiempo.
Puede volver a crear este error eliminando su FB.init. Lo que confirma que aunque se había cargado el sdk.js y existía el espacio de nombre del FB, no se había llamado a FB.init cuando estábamos tratando de utilizar los métodos de FB en otro lugar de nuestros scripts.
Entonces, debemos asegurarnos de que se haya llamado a FB.init. Utilicé un enfoque similar a esta answer :
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''));
Luego, en cualquier otro lugar, cualquier referencia a FB puede hacerse así:
fbApi.ready(function() {
FB.XFBML.parse($("#fb-comments"));
});
Este problema me plagó por un tiempo. Intenté muchas de las ideas enumeradas aquí, como cambiar el número de versión y mover / eliminar la fb-root
.
Lo que finalmente está funcionando bien para mí es eliminar toda la función window.fbAsyncInit
y especificar las propiedades init
en el hash de sdk.js
Por ejemplo:
<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>
Por supuesto, puede omitir un parámetro para usar su valor predeterminado.
No puedo encontrar este enfoque documentado en ninguna parte, así que úsala bajo tu propio riesgo. Afortunadamente, estaba actualizando un sitio anterior de v1.x
a v2.x
y utilizó esta técnica al cargar all.js
Esto también me estaba sucediendo con gran inconsistencia. En algún lugar, mi corazonada me dijo, tiene que ser un problema de tiempo. Más depuración, descubrió un error en la consola del desarrollador ejecutando manualmente " FB.login()
". El error decía: " init no llamado con la versión válida ".
En mi caso, estaba agregando //connect.facebook.net/en_US/sdk.js
como una etiqueta de script en el encabezado de la página html y window.fbAsyncInit
apareció en otro archivo justo después de eso. Esto me señaló como un problema de tiempo y, por lo tanto, cambié estas 2 etiquetas de secuencia de comandos. Ahora, una vez que había incluido window.fbAsyncInit
antes de incluir //connect.facebook.net/en_US/sdk.js
, el problema había desaparecido. Espero que esto ayude a otros.
Lo hice funcionar usando all.js en lugar de sdk.js.
En tu caso, se vería así:
js.src = "//connect.facebook.net/pl_PL/all.js";
en lugar de
js.src = "//connect.facebook.net/pl_PL/sdk.js";
Prueba este código:
setInterval(
function() { FB.api(''/me/'',
function(r) { console.log(''response: '', r); })
}, 5000);
Me di cuenta cuando estoy tratando de obtener información fb aún no se ha inicializado.
Lo arreglé agregando mi código de inicialización al final de:
FB.getLoginStatus(function(response) { init(); });
Reemplacé esto
js.src = "//connect.facebook.net/en_US/sdk.js";
con este
js.src = "//connect.facebook.net/en_US/all.js";
y funcionó :)
Resolví este error cargando el script en el documento listo en lugar de cargar el documento.
Por ejemplo, esto dio el error aproximadamente el 10% del tiempo:
$(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''));
});
mientras que esto funciona todo el tiempo:
$(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''));
});
SINGLE INCLUDE: asegúrese de que Facebook JavaScript API no esté incluido más de una vez en su página.
(Este fue mi problema)
Tenga cuidado cuando llame a FB api después de init. Init parece sincrónico, pero window.fbAsyncInit no lo es, por lo que debe esperar su ejecución. Mi ejemplo para reproducir está en la plataforma del buscador de phonegap, pero después de comprobar el código del complemento de Facebook, estoy seguro de que también se puede reproducir en un entorno JavaScript puro.
Este fue mi código que dispara el error:
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));
});
Así es como lo arreglé:
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));
});
});
}
Estoy seguro de que el siguiente código arrojará en el navegador, pero no tengo tiempo para verificarlo:
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
Tuve el mismo problema cuando intenté insertar una simple publicación de Facebook en un artículo que estaba escribiendo.
<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&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 <a href="https://www.facebook.com/feyenoord/posts/10153224326681816:0">Sunday, January 31, 2016</a></blockquote></div></div>
Cuando sdk.js
el sdk.js
Facebook, vi que .getVersion devolvía "indefinido" y, por lo tanto, no mostraba el widget.
Aparentemente Facebook no puede manejar pasar parámetros de consulta separados por &
en lugar de &
when cargando el sdk.js
Cambié mi código a &
por razones de validación
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&version=v2.3";
Usamos nuestra propia API que hace esto:
_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));
}