Обнаружить с помощью JavaScript, что скрипт заблокирован (веб-фильтрацией, брандмауэром и т. Д.) - PullRequest
5 голосов
/ 21 ноября 2011

В Internet Explorer <9, по крайней мере, ссылка на заблокированный ресурс (из-за брандмауэров, WebSense и т. Д.) Вернет ошибку.Например, если Facebook заблокирован, ссылка на файл JavaScript SDK Facebook приведет к ошибке в Internet Explorer. </p>

Можно ли проверить, заблокирован ли веб-сайт в JavaScript, перед установкой ссылки на внешний файл JavaScript, для следующих целей:

  1. Предотвращение появления ошибки JavaScript в Internet Explorer
  2. Если код зависит от внешнего файла, его можно отключить, чтобы вызвать дальнейший JavaScriptошибки, связанные с отсутствием внешней библиотеки

Ответы [ 2 ]

3 голосов
/ 21 ноября 2011

Глядя на SDK facebook, похоже, что он вводится асинхронно, вставляя элемент script в заголовок.Это означает, что все, что вам нужно сделать, это создать обработчик обратного вызова, и если 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

Простонаткнулся на этот метод, вы можете попробовать его:

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 голосов
/ 21 ноября 2011

Вы можете использовать функцию getScript jquery, она имеет функцию успеха, которая выполняется только в том случае, если скрипт был загружен, проверьте это здесь: http://api.jquery.com/jQuery.getScript/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...