O antigo JS SDK tinha uma função chamada FB.ensureInit. O novo SDK parece não ter essa função ... como posso garantir que não faço chamadas de API até que seja totalmente iniciado?
Incluo no topo 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
fonte
fonte
Respostas:
Atualização em 04 de janeiro de 2012
Parece que você não pode simplesmente chamar métodos dependentes de FB (por exemplo
FB.getAuthResponse()
) logo depoisFB.init()
como antes, poisFB.init()
parece ser assíncrono agora. Encapsular seu código em umaFB.getLoginStatus()
resposta parece funcionar para detectar quando a API está totalmente pronta:ou se estiver usando a
fbEnsureInit()
implementação abaixo:Postagem original:
Se você quiser apenas executar algum script quando o FB for inicializado, você pode colocar alguma função de retorno de chamada dentro
fbAsyncInit
:Se você deseja uma substituição exata de FB.ensureInit, então você terá que escrever algo por conta própria, pois não há uma substituição oficial (grande erro, imo). Aqui está o que eu uso:
Uso:
fonte
response
respostaFB.getLoginStatus(function(response){}
? - observe a diferença entre a "resposta atualizada" e a "resposta original" acima.fbAsyncInit
para que ela fosse chamada após o carregamentowindow.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); };
Na verdade, o Facebook já forneceu um mecanismo para se inscrever em eventos de autenticação.
No seu caso, você está usando " status: true ", o que significa que o objeto FB solicitará ao Facebook o status de login do usuário.
Ao chamar "FB.getLoginStatus ()", você está executando a mesma solicitação novamente .
Em vez disso, você poderia usar FB.Event.subscribe subscrever a auth.statusChange ou auth.authResponseChange evento ANTES você ligar FB.init
Provavelmente, ao usar " status: false ", você pode executar qualquer código logo após FB.init, porque não haverá chamadas assíncronas.
fonte
cookie
comotrue
no objeto init param.Aqui está uma solução caso você use jquery e carregamento lento assíncrono do Facebook:
fonte
version: 'v2.5'
no init json de outro modo não funcionará .. pelo menos não funcionou para mim. obrigado pela ajudaOutra maneira de verificar se o FB foi inicializado é usando o seguinte código:
Portanto, em seu evento de página pronta, você pode marcar ns.FBInitialized e adiar o evento para uma fase posterior usando setTimeOut.
fonte
Embora algumas das soluções acima funcionem, pensei em postar nossa solução eventual - que define um método 'pronto' que será acionado assim que o FB for inicializado e estiver pronto para funcionar. Ele tem a vantagem sobre outras soluções de que é seguro ligar antes ou depois do FB estar pronto.
Pode ser usado da seguinte forma:
Aqui está o arquivo de origem (observe que ele está definido dentro de um namespace 'f52.fb').
fonte
Evitei usar setTimeout usando uma função global:
NOTA EDITAR: Eu atualizei os seguintes scripts auxiliares e criei uma classe mais fácil / simples de usar; confira aqui ::: https://github.com/tjmehta/fbExec.js
fbEnsureInit chamará seu retorno de chamada após FB.init
fbEnsureInitAndLoginStatus chamará seu retorno de chamada após FB.init e após FB.getLoginStatus
Exemplo de uso de fbEnsureInit:
(FB.login precisa ser executado após o FB ter sido inicializado)
Exemplo de uso de fbEnsureInitAndLogin:
(FB.api precisa ser executado após FB.init e o usuário FB deve estar conectado.)
fonte
Em vez de usar qualquer setTimeout ou setInterval, preferiria objetos adiados (implementação por jQuery aqui ). Ainda é complicado resolver a fila no momento adequado, porque o init não tem retornos de chamada, mas combinando resultado com inscrição de evento (como alguém apontou antes de mim), deve resolver o problema e estar próximo o suficiente.
O pseudo-snippet seria o seguinte:
fonte
Aqui está um método mais simples, que não requer eventos ou tempos limite. No entanto, requer jQuery.
Use
jQuery.holdReady()
(docs)Portanto, imediatamente após seu script jQuery, atrase o evento pronto.
Então, em sua função de inicialização do Facebook, libere-o:
Então você pode usar o evento pronto normalmente:
fonte
Você pode se inscrever no evento:
ie)
fonte
Avisos pequenos, mas IMPORTANTES:
FB.getLoginStatus
deve ser chamado depoisFB.init
, caso contrário, não disparará o evento.você pode usar
FB.Event.subscribe('auth.statusChange', callback)
, mas ele não irá disparar quando o usuário não estiver logado no Facebook.Aqui está o exemplo de trabalho com ambas as funções
fonte
A API do Facebook monitora o FB._apiKey para que você possa observar isso antes de chamar seu próprio aplicativo da API com algo como:
Não tenho certeza se isso faz diferença, mas no meu caso - porque eu queria ter certeza de que a IU estava pronta - eu envolvi a inicialização com o documento jQuery pronto (último pedaço acima):
Observe também que NÃO estou usando async = true para carregar o all.js do Facebook, o que, no meu caso, parece estar ajudando a acessar a IU e a conduzir os recursos de maneira mais confiável.
fonte
Às vezes, fbAsyncInit não funciona. Não sei por que e uso esta solução alternativa então:
fonte