我在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 :(得分: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)
我想在了解了处理此类请求的方式后,我想出了这个问题:
本地文件的状态始终为“0”(不是200等)。
如果async为true,则在找不到该文件时不会抛出异常。
由于某种原因,似乎跳过readyState 3 - 如果async为false,则readyState直接转到4。
如果chrome URL的第一部分(扩展名称)不存在,则会在open()
上引发异常。
如果async为false且文件不存在,则会在onreadystatechange
上引发异常。
如果async为false且文件确实存在,则中止onreadystatechange会阻止它实际读取文件。
所以,似乎要走的路是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://
:)