我在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,但似乎无法弄清楚。
我想通了,在了解了有关此类请求处理方式的一些事情之后:
本地文件的状态始终为"0"(不是 200 等)。
如果异步为 true,则在找不到文件时不会引发异常。
由于某种原因,它似乎跳过了 readyState 3 - 如果异步为假,readyState 将直接转到 4。
如果 chrome 网址的第一部分(扩展名)不存在,则会在
open()
上引发异常。如果异步为 false 并且文件不存在,则会在
onreadystatechange
上引发异常。如果异步为 false 并且文件确实存在,则中止 onreadystatechange 会阻止它实际读取文件。
因此,似乎要走的方法是 async=false,在 readyState 更改成功发生(到 4)后中止并返回 true(文件存在)。 如果在打开或就绪状态更改时出现异常,则返回 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;
}
您可以使用 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://