Как проверить наличие ошибок 403 и 404 при изменении url ресурса?

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

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

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

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

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

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

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


person Seki    schedule 15.02.2012    source источник


Ответы (3)


Я бы проверил 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)
}
person Arend    schedule 15.02.2012
comment
Большое спасибо за то, что сообщили мне о jsfiddle, он кажется очень интересным для прототипирования. Я попробую использовать подход с использованием таблиц стилей. Что касается части сценария, я не могу протестировать известный объект, так как заранее не знаю, что находится в сценарии. - person Seki; 16.02.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.

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

person Linus Thiel    schedule 15.02.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

person RASG    schedule 05.04.2012