如何通过javascript检查chrome://文件是否存在,而不实际加载文件?

时间:2011-05-08 04:55:20

标签: javascript file firefox exists

我在Firefox扩展程序中使用以下函数来检查另一个扩展名中是否存在文件:

function chromeFileExists(fileLoc) // in extension package
{
    var xmlhttp = new window.XMLHttpRequest();
    try {
        xmlhttp.open("GET", "chrome://"+fileLoc, false);
        xmlhttp.send(null);
        var xmlDoc = xmlhttp.responseXML.documentElement;
    }
    catch(ex) {
        return false;
    }
    return true;
} 

但问题当然是,如果文件确实存在,它实际上会在它告诉我之前加载文件。我查询的一些文件大小超过1MB,所以我宁愿不将它们加载到内存中。

如何检查存在并返回而不加载文件本身?我尝试过使用onreadystatechange,但似乎无法弄明白。

3 个答案:

答案 0 :(得分:2)

您可以使用XMLHTTPRequest和setTimeout的onreadystatechange方法。我实际上没有试过这个,但我想它会像:

var clearhttp = function() {
    xmlhttp.abort();
    fileDoesNotExist = false;
}
xmlhttp.onreadystatechange=function() {
    if (xmlhttp.readyState == 3) {
        setTimeout(clearhttp, 250);
    } else if(xmlhttp.readyState == 4 && xmlhttp.status == 404){
        fileDoesNotExist = true;
    }
}

答案 1 :(得分:2)

我想在了解了处理此类请求的方式后,我想出了这个问题:

  1. 本地文件的状态始终为“0”(不是200等)。

  2. 如果async为true,则在找不到该文件时不会抛出异常。

  3. 由于某种原因,似乎跳过readyState 3 - 如果async为false,则readyState直接转到4。

  4. 如果chrome URL的第一部分(扩展名称)不存在,则会在open()上引发异常。

  5. 如果async为false且文件不存在,则会在onreadystatechange上引发异常。

  6. 如果async为false且文件确实存在,则中止onreadystatechange会阻止它实际读取文件。

  7. 所以,似乎要走的路是async = false,在readyState更改成功发生后(到4)中止并返回true(文件存在)。如果open或onreadystatechange上有异常,则返回false(不存在)。

    这是代码,如果文件存在,xmlhttp.responseXML仍为null,似乎中止,如果不存在,则抛出异常:

    function chromeFileExists(fileLoc) // in extension package
    {
        var xmlhttp = new window.XMLHttpRequest();
        try {
            xmlhttp.open("GET", "chrome://"+fileLoc, false);
            xmlhttp.onreadystatechange=function() {
                xmlhttp.abort();
            }
            xmlhttp.send(null);
        }
        catch(ex) {
            return false;
        }
        return true;
    } 
    

答案 2 :(得分:1)

怎么样:

xmlhttp.open("HEAD", "chrome://"+fileLoc, false);

测试可能比我更容易,因为我有一段时间没有搞乱扩展,你无法从正常页面请求chrome://:)