El antiguo JS SDK tenía una función llamada FB.ensureInit. El nuevo SDK no parece tener tal función ... ¿cómo puedo asegurarme de que no hago llamadas a la API hasta que esté completamente iniciado?
Incluyo esto en la parte superior de cada página:
<div id="fb-root"></div>
<script>
window.fbAsyncInit = function() {
FB.init({
appId : '<?php echo $conf['fb']['appid']; ?>',
status : true, // check login status
cookie : true, // enable cookies to allow the server to access the session
xfbml : true // parse XFBML
});
FB.Canvas.setAutoResize();
};
(function() {
var e = document.createElement('script');
e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
e.async = true;
document.getElementById('fb-root').appendChild(e);
}());
</script>
javascript
facebook
Pablo
fuente
fuente
Respuestas:
Actualización el 04 de enero de 2012
Parece que no puede simplemente llamar a métodos dependientes de FB (por ejemplo
FB.getAuthResponse()
) justo despuésFB.init()
como antes, ya que ahoraFB.init()
parece ser asíncrono. Envolver su código enFB.getLoginStatus()
respuesta parece hacer el truco de detectar cuando la API está completamente lista:o si usa la
fbEnsureInit()
implementación desde abajo:Publicación original:
Si solo desea ejecutar algún script cuando FB se inicializa, puede poner alguna función de devolución de llamada dentro
fbAsyncInit
:Si desea un reemplazo exacto de FB.ensureInit, entonces tendrá que escribir algo por su cuenta ya que no hay un reemplazo oficial (gran error en mi opinión). Esto es lo que uso:
Uso:
fuente
response
respuestaFB.getLoginStatus(function(response){}
? - observe la diferencia entre la "respuesta actualizada" y la "respuesta original" anterior.fbAsyncInit
para que se llamara después de la cargawindow.fbAsyncInit = function() { FB.init({ appId : '*************', channelUrl : 'http://www.mydomain.com', status : true, // check login status cookie : true, // enable cookies to allow the server to access the session oauth : true, // enable OAuth 2.0 xfbml : true // parse XFBML }); setTimeout(function() { myfunction(function (callback) {}, '', '', '' ); }, 1200); };
De hecho, Facebook ya ha proporcionado un mecanismo para suscribirse a eventos de autenticación.
En su caso, está utilizando " status: true ", lo que significa que el objeto FB solicitará a Facebook el estado de inicio de sesión del usuario.
Al llamar a "FB.getLoginStatus ()", vuelve a ejecutar la misma solicitud .
En su lugar, puede usar FB.Event.subscribe para suscribirse al evento auth.statusChange o auth.authResponseChange ANTES de llamar a FB.init
Lo más probable es que cuando utilice " status: false " pueda ejecutar cualquier código inmediatamente después de FB.init, porque no habrá llamadas asincrónicas.
fuente
cookie
entrue
en el objeto init param.Aquí hay una solución en caso de que use jquery y carga diferida asincrónica de Facebook:
fuente
version: 'v2.5'
en el json de inicio de lo contrario no funcionará ... al menos no lo hizo para mí. gracias por la ayudaOtra forma de verificar si FB se ha inicializado es usando el siguiente código:
Por lo tanto, en su evento de página lista, puede verificar ns.FBInitialized y aplazar el evento a una fase posterior utilizando setTimeOut.
fuente
Si bien algunas de las soluciones anteriores funcionan, pensé en publicar nuestra solución eventual, que define un método 'listo' que se activará tan pronto como FB se inicialice y esté listo para funcionar. Tiene la ventaja sobre otras soluciones de que es seguro llamar antes o después de que FB esté listo.
Se puede usar así:
Aquí está el archivo fuente (tenga en cuenta que está definido dentro de un espacio de nombres 'f52.fb').
fuente
He evitado usar setTimeout usando una función global:
EDITAR NOTA: He actualizado los siguientes scripts de ayuda y he creado una clase que es más fácil / simple de usar; compruébalo aquí ::: https://github.com/tjmehta/fbExec.js
fbEnsureInit llamará a su devolución de llamada después de FB.init
fbEnsureInitAndLoginStatus llamará a su devolución de llamada después de FB.init y después de FB.getLoginStatus
Uso de ejemplo de fbEnsureInit:
(FB.login debe ejecutarse después de que se haya inicializado FB)
Uso de ejemplo de fbEnsureInitAndLogin:
(FB.api debe ejecutarse después de FB.init y el usuario de FB debe iniciar sesión).
fuente
En lugar de usar setTimeout o setInterval, me limitaría a los objetos diferidos (implementación por jQuery aquí ). Todavía es complicado resolver la cola en el momento adecuado, porque init no tiene devoluciones de llamada, pero combinando el resultado con la suscripción al evento (como alguien señaló antes que yo), debería funcionar y estar lo suficientemente cerca.
El pseudo-fragmento tendría el siguiente aspecto:
fuente
Este es un método más simple, que no requiere eventos ni tiempos de espera. Sin embargo, requiere jQuery.
Utilice
jQuery.holdReady()
(docs)Entonces, inmediatamente después de su script jQuery, retrase el evento listo.
Luego, en su función de inicio de Facebook, suéltelo:
Entonces puede usar el evento listo como de costumbre:
fuente
Puedes suscribirte al evento:
es decir)
fuente
Avisos pequeños pero IMPORTANTES:
FB.getLoginStatus
debe invocarse despuésFB.init
, de lo contrario no disparará el evento.puede usar
FB.Event.subscribe('auth.statusChange', callback)
, pero no se activará cuando el usuario no haya iniciado sesión en Facebook.Aquí está el ejemplo de trabajo con ambas funciones
fuente
La API de Facebook busca el FB._apiKey para que pueda ver esto antes de llamar a su propia aplicación de la API con algo como:
No estoy seguro de que esto marque la diferencia, pero en mi caso, porque quería asegurarme de que la interfaz de usuario estuviera lista, he envuelto la inicialización con el documento de jQuery listo (último bit arriba):
Tenga en cuenta también que NO estoy usando async = true para cargar all.js de Facebook, que en mi caso parece estar ayudando a iniciar sesión en la interfaz de usuario y manejar las funciones de manera más confiable.
fuente
A veces, fbAsyncInit no funciona. No sé por qué y uso esta solución entonces:
fuente