如何通过 javascript 检查 chrome:// 文件是不是存在,而不实际加载文件?
Posted
技术标签:
【中文标题】如何通过 javascript 检查 chrome:// 文件是不是存在,而不实际加载文件?【英文标题】:How to check if a chrome:// file exists via javascript, without actually loading the file?如何通过 javascript 检查 chrome:// 文件是否存在,而不实际加载文件? 【发布时间】:2011-05-08 04:55:20 【问题描述】:我在 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】:您可以使用 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,但我想如果您点击 readyState==3 并且它是 404,您将已经拥有状态码,因此不需要超时(或至少太长)。另外,我不确定这是否适用于“本地”文件,因为它可能只是将整个内容复制到一个块中。 不,这不起作用...如果文件存在,则状态始终为0,就绪状态始终为4。如果我使用xmlhttp.open("GET", "chrome://"+fileLoc, true);
,则如果文件存在,则它可以工作,但是如果没有,则抛出NS_ERROR_FILE_NOT_FOUND
(我认为这意味着它忽略了中止)。
是的,我相信这就是问题所在......它可能适用于远程文件,但不适用于本地文件。【参考方案2】:
在了解了有关处理此类请求的方式的一些事情之后,我想我想通了:
本地文件的状态始终为“0”(不是 200 等)。
如果 async 为真,则在找不到文件时不会抛出异常。
似乎出于某种原因跳过了 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;
【讨论】:
如何从 php 文件中使用它?【参考方案3】:怎么样:
xmlhttp.open("HEAD", "chrome://"+fileLoc, false);
你可能比我更容易测试,因为我有一段时间没有搞乱扩展了,你不能从普通页面完全请求 chrome://
:)
【讨论】:
感谢您的建议,但是不,这仍然会返回文件的内容。 我不相信HEAD
是公认的方法:developer.mozilla.org/en/XMLHttpRequest#open%28%29 - 而且,它说它会忽略非 HTTP 请求的方法,我认为这是?
这是一个有效的 HTTP 方法,但你说得对,它说它被忽略了……嗯,对不起,这是我最好的选择!
没关系,感谢您的帮助。我想通了,但由于我是新用户,我要等到八小时才能回答我自己的问题。稍后我会发布解决方案。以上是关于如何通过 javascript 检查 chrome:// 文件是不是存在,而不实际加载文件?的主要内容,如果未能解决你的问题,请参考以下文章
在 Chrome 开发者工具中检查 Javascript Hover