使用JavaScript检测脚本被阻止(通过Web过滤,防火墙等)

kev*_*nji 5 javascript internet-explorer

在Internet Explorer <9中,至少链接到被阻止的资源(由于防火墙,WebSense等)将返回错误.例如,如果Facebook被阻止,链接到Facebook SDK JavaScript文件将导致Internet Explorer出错.

出于以下目的,是否可以在链接到外部JavaScript文件之前测试网站是否在JavaScript中被阻止:

  1. 防止JavaScript错误显示在Internet Explorer中
  2. 如果代码依赖于外部文件,则可以阻止其运行,从而导致与缺少外部库相关的进一步JavaScript错误

Abd*_*aly 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>
Run Code Online (Sandbox Code Playgroud)

对于更一般的用例,类似的方法适用于您可以使用 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;
}
Run Code Online (Sandbox Code Playgroud)

更新

刚刚遇到这个方法,你可能想尝试一下:

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);
}
Run Code Online (Sandbox Code Playgroud)