2011-03-16 12 views
32

A veces recibo el problema "FB no está definido" al cargar http://connect.facebook.net/en_US/all.jsCómo solucionar "FB no está definido"?

Me he dado cuenta de que el problema es porque a veces mi sitio web simplemente no carga ese archivo. Entonces no obtiene nada, y el objeto FB literalmente no existe.

Mi solución es evitar que mis usuarios cuando esto sucede, por lo que he tratado de los siguientes códigos en JavaScript, pero ninguno parece funcionar:

if (FB) {/*run the app*/} else {/*alert the user*/} 
if (FB!==false) {/*run the app*/} else {/*alert the user*/} 
if (FB!='undefined') {/*run the app*/} else {/*alert the user*/} 

gracias por la respuesta!

Respuesta

16

Suponiendo es una variable que contiene el objeto de Facebook, me gustaría probar algo como esto:

if (typeof(FB) != 'undefined' 
    && FB != null) { 
    // run the app 
} else { 
    // alert the user 
} 

Con el fin de probar que algo no está definida en simple JavaScript antiguo, debe usar el operador "typeof". La muestra que muestra donde la compara con la cadena 'indefinido' se evaluará como falsa a menos que su objeto FB realmente contenga la cadena 'indefinido'.

Como nota aparte, es posible que desee utilizar varias herramientas como Firebug (en Firefox) para ver si puede averiguar por qué el archivo de Facebook no se está cargando.

2

Estuviste muy cerca con tu ejemplo original. Usted podría utilizar @ sugerencia de Jandy o:

FB
if (typeof FB != 'undefined') 
1

Es bastante extraño que FB no se cargue en su javascript si tiene la etiqueta del script allí correctamente. Comprueba que no tengas bloqueadores de javascript, bloqueadores de anuncios, bloqueadores de seguimiento, etc. instalados en tu navegador que neutralicen tu código de FB Connect.

+0

lo arreglé cambiando a RickLeinecker

+1

@RickLeinecker puede explicar lo que ha cambiado? – rAjA

+0

rAjA eliminó la carga asíncrona del script, por lo que la página espera mientras se carga este script en lugar de cargar otra lista de scripts externos/internos – nvvetal

76

creo que debe resolver el problema principal en lugar, que la solución es proporcionada por Facebook (Carga del SDK de forma asincrónica):

debe insertar directamente después de la etiqueta de apertura en cada página que desea cargarlo:

<script> 
    window.fbAsyncInit = function() { 
    FB.init({ 
     appId  : 'your-app-id', 
     xfbml  : true, 
     version : 'v2.1' 
    }); 
    }; 

    (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')); 
</script> 

Desde el documentation:

El Facebook SDK para JavaScript no tiene ningún archivo independiente que necesite descargarse o instalarse, en su lugar solo necesita incluir una pequeña porción de JavaScript normal en su HTML que cargará asíncronamente el SDK en sus páginas . La carga asíncrona significa que no bloquea la carga de otros elementos de su página.

ACTUALIZACIÓN: utilizando la última versión del código de la documentación.

+1

gracias a su respuesta Finalmente descubrí [mi problema] (http://stackoverflow.com/q/6468103/7 70984)! +1 –

11

supongo que se ha perdido para poner punto y coma ; en la llave de cierre de }window.fbAsyncInit = function() { ... };

+0

¡Guau, gracias! –

+0

Los puntos y coma no son generalmente necesarios en Javascript. La única vez que los necesita es si está poniendo 2 declaraciones que podrían estar separadas por un punto y coma en la misma línea. Asumiendo que el código no ha cambiado desde que el asker lo publicó, su código se ve bien para mí. – user3413723

1

Nunca he definido el FB. Resultó que estaba creando prototipos de funciones en la clase Object llamada "merge" y otra llamada "toArray". Ambos arruinaron Facebook, no hay mensajes de error pero no se cargaría.

Cambié los nombres de mis prototipos, funciona ahora. Oye, si Facebook va a prototipo Object, ¿no debería permitírseme prototiparlo?

1

FB recomienda agregar el async all.js incluido inmediatamente después del cuerpo, para que el objeto FB se prepare cuando lo use en la página.

También puede tener retardo artificial utilizando setTimeout para asegurarse de que el objeto FB esté cargado. p.ej.

<script>setTimeout(function(){ 
FB.Event.subscribe('edge.create', 
function (response) { 
    alert('msg via fb'); 
});},2000); 
</script> 
0
<script> 
    window.fbAsyncInit = function() {  
     FB.init({  
      appId  :'your-app-id',  
      xfbml  :true,  
      version :'v2.1' 
     }); 
    }; 
    (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')); 
</script> 

De la documentación: El SDK de Facebook JavaScript no tiene ningún archivos independientes que necesitan ser descargado o instalado, en lugar sólo hay que incluir una pieza corta de JavaScript regular en su tha HTML

4

Hay solución para usted :)

debe ejecutar la secuencia de comandos después de la ventana de carga

si utiliza jQuery, puede utilizar de forma sencilla :

<div id="fb-root"></div> 
<script> 
    window.fbAsyncInit = function() { 
     FB.init({ 
      appId  : 'your-app-id', 
      xfbml  : true, 
      status  : true, 
      version : 'v2.5' 
     }); 
    }; 

    (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')); 
</script> 

<script> 
$(window).load(function() { 
    var comment_callback = function(response) { 
     console.log("comment_callback"); 
     console.log(response); 
    } 
    FB.Event.subscribe('comment.create', comment_callback); 
    FB.Event.subscribe('comment.remove', comment_callback); 
}); 
</script> 
0

Tuve un problema similar y resultó ser Adblocker Pro. Asegúrese de verificar que esta u otras extensiones de bloqueo se hayan deshabilitado. Perdí alrededor de 1 hora y 30 minutos debido a esto. Sentirse como un novato tales;)

-1
... 
</head> 
<body> 
    <!-- Load Facebook SDK for JavaScript --> 
    <div id="fb-root"></div> 
<script type="text/javascript"> 
... 

Comprobar div id = "fb-root"/div "!!! Es muy importante ejecutar