Javascript 如何在Firefox中检测文件://URL的脚本加载失败?

Javascript 如何在Firefox中检测文件://URL的脚本加载失败?,javascript,firefox,onerror,Javascript,Firefox,Onerror,我想检测脚本标记(动态创建并添加到DOM中)是否无法加载。OneError事件可以工作,Firefox中的file://URL除外 不幸的是,如果脚本标记的src是file://URL(或相对URL,并且页面是通过file://URL加载的),那么这些技术(超时除外,这在我的例子中是不可接受的)在Firefox中似乎都不起作用 测试用例: var script = document.createElement('script'); script.setAttribute('type', 'tex

我想检测脚本标记(动态创建并添加到DOM中)是否无法加载。OneError事件可以工作,Firefox中的file://URL除外

不幸的是,如果脚本标记的src是file://URL(或相对URL,并且页面是通过file://URL加载的),那么这些技术(超时除外,这在我的例子中是不可接受的)在Firefox中似乎都不起作用

测试用例:

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);
将其加载到带有文件://URL的HTML页面中。OneError事件不会在Firefox中执行。从Web服务器或Safari或Chrome上加载,它将

这对我来说似乎是一个错误。有什么已知的解决方法吗

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!'); });

这有点像黑客,但似乎有效。

如果您使用Pauls解决方案检索文档,但忽略了结果,该怎么办。如果它加载了“创建脚本”标记。缺点是文件会加载两次。

你应该接受问题的答案。@Marcel Korpel:他说超时不是一个选项,所以这不起作用。作为参考,当基于
文件://
的URL加载失败时,Firefox没有触发
错误事件的问题是。正如Tom指出的,这种方法的一个缺点是,如果通过XHR加载脚本,就会丢失脚本的调试元数据。是的,这是我目前使用的解决方案,但我对此不满意;)