如何通过 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 检查 cookie?

在 Chrome 开发者工具中检查 Javascript Hover

如何检查 Flash 插件在 Chrome 中是不是被阻止

在 chrome 上检查 IOS 设备

从 Chrome 远程调试协议访问 JavaScript 变量

如何检查 Javascript 对象