Как проверить ошибки 403 и 404 при изменении URL ресурса? - PullRequest
4 голосов
/ 15 февраля 2012

Я делаю пользовательский скрипт для расширения TamperMonkey Chrome (он аналогичен созданию пользовательского скрипта для GreaseMonkey).

В моем скрипте я перебираю некоторые внешние ресурсы документа (img, css, ссылки, скрипты) через document.getElementsByTagName() и меняю их атрибуты src или href на другой URL.

В большинстве случаев новый URL-адрес загружается правильно, но в некоторых случаях он заканчивается ошибкой 404 или 403. Мой прокси-сервер.

Не могли бы вы дать мне несколько советов о том, как правильно обрабатывать (если это возможно) «ресурс не может быть загружен с новым URL»? Кроме того, в случае, когда запрашиваемый ресурс приводит к перенаправленному URL, можно ли сказать, что ресурс был перенаправлен (как проверить на 302)?

Я сейчас использую голый javascript, без jquery. Но если jQuery может помочь мне, я готов принять его.

Я думал о тестировании заголовков из результата XMLHttpRequest для каждого URL ресурса, но для меня это похоже на использование артиллерийского оружия для уничтожения мухи. Я бы предпочел использовать правильный обработчик, который может быть запущен только в случае недоступности ресурса.

Редактировать : альтернативно, я был бы в порядке, если бы в chrome было свойство своего рода статуса для каждого загруженного объекта, который я мог бы проверить ...

Ответы [ 3 ]

2 голосов
/ 15 февраля 2012

Я бы проверил document.styleSheets в javascript.

Вот рабочий jsfiddle для таблиц стилей:

http://jsfiddle.net/BQxBz/4/

var styleSheetExists = function(name) {
    for (var i in document.styleSheets) {
        if (typeof document.styleSheets[i] == "object") {
            link = document.styleSheets[i].href;
            if (link === null) {
                continue;
            }

            if (link.indexOf(name, link.length - name.length) !== -1) {
                return true;
            }
        }
    }
    return false;
}

$(document).ready(function() {
    console.log(styleSheetExists('jquery-ui.css'));
    console.log(styleSheetExists('doesnotexist.css'));
});

Для javascript я бы использовалобнаружение объекта: таким образом, посмотрите, есть ли определенный объект, который должен быть загружен определенным скриптом.Например, чтобы обнаружить jQuery:

http://jsfiddle.net/TqQtE/

if (typeof jQuery == "undefined")
{
  // load jquery
  var fileref=document.createElement('script')
  fileref.setAttribute("type","text/javascript")
  fileref.setAttribute("src", "http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js")
  document.getElementsByTagName("head")[0].appendChild(fileref)
}
1 голос
/ 15 февраля 2012

Это просто идея, я не уверен насчет жизнеспособности, но, возможно, стоит попробовать.Объяснение в коде:

var errorHandler = function(event) {
  // Do something if the script could not be loaded
};

var scripts = document.getElementsByTagName("script");
for(var i = 0, len = scripts.length; i < len; i++) {
  scripts[i].onerror = errorHandler;
  scripts[i].src = /* Some way to get your new src */;
}

Я не уверен, работают ли обработчики onload, onerror при изменении src существующего тега script.

Пожалуйста, сообщите ваши выводы.;)

0 голосов
/ 05 апреля 2012

Я подумал о тестировании заголовков из результата XMLHttpRequest для URL каждого ресурса, но для меня это похоже на использование артиллерийского оружия убить муху.

хорошо ... это то, что я сделал, но наши сценарии имеют разные цели.

    function conectar(metodo, endereco, resposta, corpo) {
        callback = function(xhr) { resposta(xhr) };
        GM_xmlhttpRequest({
            "method"    : metodo,
            "url"       : endereco,
            "onerror"   : callback,
            "onload"    : callback,
            "headers"   : {'Content-Type' : 'application/x-www-form-urlencoded'},
            "data"      : corpo
        });
    }

, а затем

conectar('HEAD', linkkhref, resp)

проверьте мой здесь: RandomProxyHeader

...