2011-11-20 16 views
5

En Internet Explorer < 9, al menos, el enlace a un recurso bloqueado (debido a firewalls, WebSense, etc.) devolverá un error. Por ejemplo, si Facebook está bloqueado, el enlace al archivo Facebook SDK JavaScript dará como resultado un error en Internet Explorer.Detectar con JavaScript que un script está bloqueado (por filtrado web, firewall, etc.)

¿Es posible comprobar si un sitio web está bloqueado en JavaScript, antes de enlazar al archivo JavaScript externo, para los siguientes propósitos:

  1. evitar un error de JavaScript de aparecer en Internet Explorer
  2. Si código depende del archivo externo, puede ser impedido de correr, para causar errores más de JavaScript relacionados con la falta de la biblioteca externa
+0

pregunta similar: http://stackoverflow.com/questions/2027849/how-to-trigger-script-onerror-in-internet-explorer/2032014#2032014 – Ktash

+0

Dos de las otras respuestas en la pregunta @Kt las menciones de cenizas también pueden ser útiles para otros: http://stackoverflow.com/questions/2027849/how-to-trigger-script-onerror-in-internet-explorer/2027892#2027892 usa window.onerror y http: // stackoverflow .com/questions/2027849/how-to-trigger-script-onerror-in-internet-explorer/8066204 # 8066204 usa onload. – ToolmakerSteve

Respuesta

3

Al mirar el SDK de Facebook, parece que se inyecta de forma asincrónica insertando un elemento de script en el encabezado. Esto significa que todo lo que tiene que hacer es crear el controlador de devolución de llamada y si Facebook está bloqueado, nunca se llamará. No deberías obtener ningún error de script del navegador. Por lo que debe ser capaz de hacer algo como:

<div id="fb-root"></div> 
<script> 
    var FACEBOOK_BLOCKED = true; 
    window.fbAsyncInit = function() { 
    FACEBOOK_BLOCKED = false; 
    FB.init({ 
     appId  : 'YOUR_APP_ID', // App ID 
     channelURL : '//WWW.YOUR_DOMAIN.COM/channel.html', // Channel File 
     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 
    }); 

    // Additional initialization code here 
    }; 

    // Load the SDK Asynchronously 
    (function(d){ 
    var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;} 
    js = d.createElement('script'); js.id = id; js.async = true; 
    js.src = "//connect.facebook.net/en_US/all.js"; 
    d.getElementsByTagName('head')[0].appendChild(js); 
    }(document)); 
</script> 

Para un caso de uso más general, un enfoque similar funciona con cualquier secuencia de comandos que se puede llamar utilizando un enfoque JSON-P. Esto, por supuesto, requiere que el servidor tiene una función de devolución de llamada como parámetro (o automáticamente llama a un pre-llamada función):

// Load some SDK Asynchronously 
(function(d){ 
    var js = d.createElement('script'); 
    js.src = "http://www.example.com?callback=myfunc"; 
    d.getElementsByTagName('head')[0].appendChild(js); 
}(document)); 

var SCRIPT_LOADED = false; 
var myfunc = function() { 
    SCRIPT_LOADED = true; 
} 

ACTUALIZACIÓN

encontré con this método, es posible que desee a darle un tiro:

function loadScript(sScriptSrc, oCallback) { 
    var oHead = document.getElementById('head')[0]; 
    var oScript = document.createElement('script'); 
    oScript.type = 'text/javascript'; 
    oScript.src = sScriptSrc; 
    // most browsers 
    oScript.onload = oCallback; 
    // IE 6 & 7 
    oScript.onreadystatechange = function() { 
     if (this.readyState == 'complete') { 
      oCallback(); 
     } 
    } 
    oHead.appendChild(oScript); 
} 
+0

El SDK de Facebook fue simplemente un ejemplo. ¿Este código funcionaría para cualquier script que encuentre? – mc10

+0

No, no lo hará, actualicé la respuesta para el caso de uso más general. –

+0

Excelente, gracias! – mc10

0

puede utilizar la función getScript de jQuery, que tiene una función de éxito que es única execu ted si el script se ha cargado, compruébelo aquí: http://api.jquery.com/jQuery.getScript/

+0

Preferiría no tener que recurrir a jQuery; Sin embargo, si usar jQuery es la única solución, lo haré. – mc10

+0

Busqué en getScript, pero creo que usa ajax, por lo que puede no funcionar si el archivo javascript que está extrayendo no está alojado en su dominio. –

Cuestiones relacionadas