Как определить загрузку файла сценарием: // URL не работает в Firefox? - PullRequest
6 голосов
/ 11 ноября 2010

Я хочу определить, не удается ли загрузить тег сценария (который был динамически создан и добавлен в DOM).Событие onerror работает, за исключением URL-адресов file: // в Firefox.

К сожалению, ни один из описанных здесь методов (кроме таймаутов, которые в моем случае неприемлемы), похоже, не работает в Firefoxесли источником тега script является файл: // URL (или относительный URL и страница была загружена через файл: // URL)

Контрольный пример:

var script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('src', 'doesnotexist.js');
script.onerror = function() { alert("Loading failed!"); }
document.getElementsByTagName('head')[0].appendChild(script);

Загрузитьэто на странице HTML с файлом: // URL.Событие onerror не будет выполняться в Firefox.Загрузите с веб-сервера, или в Safari, или в Chrome, и это произойдет.

Мне кажется, это ошибка.Есть ли какой-нибудь известный способ обойти это?

Ответы [ 2 ]

2 голосов
/ 11 ноября 2010
var loadScript = function(scriptURL, failureCallback) {
    var script = document.createElement('script'),
        scriptProtocol = scriptURL.match(/^([a-zA-Z]+:)\/\//);
    script.setAttribute('type', 'text/javascript');

    if (navigator.product === 'Gecko' &&
        navigator.userAgent.indexOf('KHTML') === -1 &&
        window.location.protocol === 'file:' &&
        (!scriptProtocol || scriptProtocol[1] === 'file:')) {

        var req = new XMLHttpRequest();
        req.open('GET', scriptURL, true);
        req.onreadystatechange = function () {
            if (req.readyState === 4) {
                if (req.status === 0)
                    script.textContent = req.responseText;
                else
                    failureCallback();
            }
        };
        try {
            req.send(null);
        }
        catch (e) {
            failureCallback();
        }
    }
    else {
        script.setAttribute('src', scriptURL);
        script.onerror = failureCallback; 
    }

    document.getElementsByTagName('head')[0].appendChild(script);
};

loadScript('doesnotexist.js', function() { alert('Loading failed!'); });

Немного взлома, но, похоже, работает.

1 голос
/ 12 ноября 2010

Что если вы использовали решение Паулса для получения документа, но проигнорировали результат. Если он загружается, создайте свой скрипт-тег. Недостатком является то, что файл будет загружен дважды.

...