2011-11-20 24 views
5

在Internet Explorer中< 9,至少,链接到被阻止的资源(由于防火墙,WebSense等)将返回错误。例如,如果Facebook被阻止,链接到Facebook SDK JavaScript文件将导致Internet Explorer中出现错误。用JavaScript检测脚本被阻止(通过网页过滤,防火墙等)

是否有可能测试如果一个网站被封锁在JavaScript中,链接到外部JavaScript文件,用于以下目的之前:

  1. 不会展示了在Internet Explorer
  2. 如果一个JavaScript错误代码取决于外部文件,它可以阻止运行,导致进一步的JavaScript错误相关的缺乏外部库
+0

类似的问题:http://stackoverflow.com/questions/2027849/how-to-trigger-script-onerror-in-internet-explorer/2032014#2032014 – Ktash

+0

的两在@Kt问题中的其他答案ash提及也许对其他人有用:http://stackoverflow.com/questions/2027849/how-to-trigger-script-onerror-in-internet-explorer/2027892#2027892使用window.onerror和http:// stackoverflow .com/questions/2027849/how-to-trigger-script-onerror-in-internet-explorer/8066204#8066204使用onload。 – ToolmakerSteve

回答

3

看看facebook SDK,看起来像通过将脚本元素插入头部来异步注入。这意味着你所要做的就是创建回调处理程序,如果Facebook被封锁,那么永远不会被调用。你不应该得到任何浏览器脚本错误。所以,你应该能够做这样的事情:

<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> 

对于更广泛的使用案例,类似的做法将与您可以调用使用JSON-P的方法的任何脚本工作。这当然需要服务器需要一个回调函数作为参数(或自动调用预先命名的功能):

// 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; 
} 

UPDATE

跨越this方法就来了,你可能想给它一个镜头:

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

Facebook SDK只是一个例子。此代码是否适用于我找到的任何脚本? – mc10

+0

不,我不会更新一般用例的答案。 –

+0

非常好,谢谢! – mc10

0

你可以使用jquery的getScript函数,它有一个成功的功能,只有执行如果脚本已经加载,请在此处查看:http://api.jquery.com/jQuery.getScript/

+0

我宁愿不必诉诸jQuery;然而,如果使用jQuery是唯一的解决方案,我会的。 – mc10

+0

我查看了getScript,但我相信使用ajax,因此如果您要拖动的JavaScript文件不在您的域中,它可能无法正常工作。 –