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



我在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,但似乎无法弄清楚。

我想

我想通了,在了解了有关此类请求处理方式的一些事情之后:

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

  2. 如果异步为 true,则在找不到文件时不会引发异常。

  3. 由于某种原因,它似乎跳过了 readyState 3 - 如果异步为假,readyState 将直接转到 4。

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

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

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

因此,似乎要走的方法是 async=false,在 readyState 更改成功发生(到 4)后中止并返回 true(文件存在)。 如果在打开或就绪状态更改时出现异常,则返回 false(不存在)。

下面是代码,如果文件存在,它似乎会在xmlhttp.responseXMLnull时中止,如果不存在,则会引发异常:

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;
} 

您可以使用 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;
    }
}

呢:

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

您可能比我更容易测试,因为我有一段时间没有弄乱扩展程序了,而且您无法从普通页面:)完全请求chrome://

相关内容

  • 没有找到相关文章

最新更新