[英]How to check if a chrome:// file exists via javascript, without actually loading the file?
我在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,但似乎无法弄清楚。
您可以使用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;
}
}
在了解了有关处理此类请求的方式的一些知识之后,我想我已经解决了:
本地文件的状态始终为“ 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;
}
关于什么:
xmlhttp.open("HEAD", "chrome://"+fileLoc, false);
您测试起来可能比我更容易,因为我已经有一段时间没有弄乱扩展了,并且您不能从普通页面中完全请求chrome://
:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.