2010-09-03 12 views
8

Quiero fuente de un archivo JavaScript desde facebook http://connect.facebook.net/en_US/all.jsdetectar y suprimir los errores que cargan archivo javascript

La organización para la que trabajo tiene un firewall que bloquea el acceso a Facebook, que sólo sirve para una página HTML que dice "Acceso denegado bla, bla, bla "

Quiero ser capaz de poner una etiqueta javascript src <script src="http://... "> </script> y detectar y suprimir las advertencias cuando el navegador intenta evaluar el html como javascript.

¿Alguien sabe cómo?

Respuesta

2

Con la etiqueta estándar <script>, no es posible. No hay nada realmente en funcionamiento en el momento en que se acciona el src del script y se descarga el contenido, por lo que no se puede incluir en un bloque try/catch. Hay algunos consejos here sobre cómo cargar scripts dinámicamente. Tal vez los navegadores agregarán algunas cosas al elemento DOM creado allí que puedes verificar.

+0

el enlace informados se ha ido, por casualidad tienes los consejos en otro lugar? – Rodolfo

0

¿Por qué no lo hace de manera muy sencilla ?:

if(!window.FB) { // or (typeof window.FB === "undefined") 
    alert ("ERROR: http://connect.facebook.net/en_US/all.js is not loaded"); 
} 
if(!window.jQuery) { // or (typeof window.jQuery === "undefined") 
    alert ("ERROR: jQuery is not loaded"); 
} 
// and so on 
+1

Él quiere suprimir los errores también, sin embargo. Es discutible el problema más grande. – slikts

+0

@Reinis I.: 'alerta' es solo un ejemplo. Si uno detecta ese 'typeof window.FB ===" undefined "' uno tiene probablemente las advertencias en el cuerpo del navegador, por lo que uno puede sobrescribir el cuerpo con otro código HTML que desee. Pero no tengo idea de cómo funciona el firewall. Si ** redirige ** a otra página y nuestra página con nuestro script no se mostrará, entonces no podemos resolver el problema con respecto a cualquier JavaScript. En el caso, puede intentar cargar el script con 'jQuery.ajax' y prueba si el resultado comienza con '' luego cargamos la página ERROR en lugar de JS. Uno puede cargar e iniciar JS con 'jQuery.getScript'. – Oleg

+0

No dije nada sobre 'alert()' en particular, y no puedes cargar scripts de Facebook a través de Ajax debido a la misma política de origen. – slikts

2

Ésta es una solución, no una respuesta directa, pero que podría simplemente establecer un reverse proxy fuera del firewall para Facebook y cargar el guión desde allí. En lugar de fallar con mayor gracia, permitiría que la secuencia de comandos no falle.

0

Pruebe la función a continuación, solo llamará a onload_function si el script se ha cargado. Puede establecer un tiempo de espera para cancelar el script.

function include_js(url, onload_function) { 
    var script = document.createElement("script"); 
    script.type = "text/javascript"; 

    if (script.readyState) { 
     script.onreadystatechange = function(){ 
      if (script.readyState == "loaded" || script.readyState == "complete"){ 
       script.onreadystatechange = null; 
       onload_function(); 
      } 
     }; 
    } else { 
     script.onload = function(){ 
      onload_function(); 
     }; 
    } 
    script.src = url; 
    document.getElementsByTagName("head")[0].appendChild(script); 
} 
+0

Esto intentará cargar la página HTML como una secuencia de comandos. Necesita agregar alguna lógica que detecte si recibió Javascript o HTML (por ejemplo, al analizar 'getResponseHeader (" Content-Type ")') –

+1

AFAIK, solo puede obtener el encabezado de respuesta de XHR (no de cargar una etiqueta de script). XHR no es compatible con solicitudes de dominio cruzado, por lo que no se puede utilizar para tomar secuencias de comandos de Facebook como en la pregunta original. – Annie

2

Prueba de esto, y ver si funciona para usted:

<script type="text/javascript" onerror="throw('An error occurred')" src="http://connect.facebook.net/en_US/all.js"></script> 

Alternativamente, si usted tiene acceso a un script de proxy para agarrar el contenido externo lo usaría a través de un xmlHttpRequest para agarrar el JS contenido. Si tiene éxito, eval el contenido (sí, eval es malo, lo sé).

Yo agregaría que si sabes que el JS no funcionará, ¿para qué molestarse?

4

Parece que jQuery.getScript es lo que necesita como se mencionó. O puede ejecutar manualmente:

$.ajax({ 
    url: url, 
    dataType: 'script', 
    success: function(){document.write('<script src="http://... "> </script>');} 
}); 

y anexar su html en la carga éxito con la etiqueta <script></script>.

+0

Como la url de src está en un dominio diferente de la página que lo contiene, su solicitud de ajax siempre fallará. – StriplingWarrior

+0

http://jsfiddle.net/Gxq7B/ parece que funciona, ¿no? – dmitko

+1

Aunque está intentando hacer lo contrario: detectar errores si no se carga. – Annie

0

En Firefox y IE, debería poder usar window.onerror para esto. Se puede aprovechar el hecho de que las secuencias de comandos se ejecutan en el orden en que aparecen en el código HTML para envolver un controlador de errores en torno a sólo el guión facebook:

<script> 
// Remember old error handler, if there is one. 
var oldOnError = window.onerror; 
// Special error handler for facebook script 
window.onerror = function(message, url, linenumber) { 
    // Potentially alert the user to problem 
    alert('Problem with facebook: ...'); 
    // Return true to suppress default error handling 
    return true; 
} 
</script> 

<!-- Load facebook script --> 
<script src="http://connect.facebook.net/en_US/all.js"></script> 

<script> 
// Remove error handler for facebook script 
window.onerror = oldOnError; 
</script> 
Cuestiones relacionadas