【问题标题】:Local javascript cannot open local file本地javascript无法打开本地文件
【发布时间】:2017-06-05 13:10:39
【问题描述】:

请告诉我,为什么本地 javascript 无法打开本地文件? 我正在尝试创建一个简单的 javascript/html 应用程序,该应用程序应从本地文件系统在本地计算机上运行。此应用正在尝试使用不同的方法读取配置文件 (json),但出现以下错误 (Chrome):

  1. 如果是XMLHttpRequest,方法open("GET", filename, true)会抛出异常:

    XMLHttpRequest 无法加载 file:///bla-bla-bla。跨源请求仅支持协议方案:http、data、chrome、chrome-extension、https、chrome-extension-resource。

  2. 如果是document.createElement("iframe").src=filename,我还有另一个例外:

    VM596:1 未捕获的 DOMException:无法从 'HTMLIFrameElement' 读取 'contentDocument' 属性:阻止具有源“null”的框架访问跨域框架。”

  3. var f=new File([], filename, { type: "text/plain" }); 的情况下,我得到了大小为零且完全没有错误的文件对象。然后 FileReader 返回一个空结果。

所以,我的问题是: 为什么是“跨域”?这些文件存储在同一目录中! 以及如何从运行脚本的同一源/目录打开本地文件? 请帮忙。

P.S.:是的,我知道 --allow-file-access-from-files,但我需要由客户运行它。

【问题讨论】:

  • file:// 协议对于测试或查看单个文件的用途确实非常有限。对于真正的 webapp 测试,您需要设置一个小的、基本的“web 服务器”程序,它可以接受对 localhost/index.htmllocalhost/bla-bla-bla.js 的请求。例如,Python 允许您通过命令行在当前文件夹中设置一个 python -m SimpleHttpServer 80
  • @BbIKTOP,您可以将 JSON 文件转换为 javascript 文件(将 var myVariable = 添加到 json 文件的开头)然后使用 <script src='myfile.js'></script> 包含它,数据将在 myVariable (目的)。虽然不是最好的解决方案,但有效。
  • 他们有超过 100 台没有 LAN,运行非常特定的软件(健身房),这个应用程序旨在显示一些广告视频剪辑。这就是为什么不可能在网络服务器上使用如此明显的解决方案的原因,这就是我在这里问这个问题的原因。当然,可以不使用 json 配置,而是将配置放入代码中,也许在单独的文件中。没什么意思,没必要在这里问也不讨论。
  • 这是 chrome 做事的方式,谷歌已经声明了它,因此除了创建 Web 扩展程序之外,您无能为力...使用 firefox、edge 或 internet ex。 ..不,不要用那个!
  • 使用脚本标签与 xhr 之间的部署、更新或运行时功能绝对没有区别......至于 iframe 问题,您显示的代码将毫无意义,因为您已经创建您“失去”访问权限的 iframe,因此无法将其添加到 DOM

标签: javascript ajax


【解决方案1】:

这个聚会有点晚了,但我遇到了同样的问题,这就是我解决问题的方法

创建一个这样的js模板:

template.js

(function(global, factory) {
    "use strict";
    factory(global);
})(typeof window !== "undefined" ? window : this, function(window) {
    "use strict";
    var myObjectJson = '<JSONREPLACE>';
    var myObject = JSON.parse(myObjectJson);
    window.myObject = myObject;
});

然后,让您的 json 用您的程序替换标签,该程序可以生成导出的 js 本身,或者创建一个批处理脚本文件来为您执行此操作。我正在使用 C#,所以我只是直接从那里构建模板。如果您正在使用的语言是半体面的,您应该能够生成和导出您的文件。

确保您使用的是缩小的 json 字符串。

然后像使用 jQuery 一样使用生成的文件

<script src="generated.js"></script>

并使用

访问您的对象
window.myObject;

设置起来稍微复杂一些,但是一旦设置好,就完全消除了跨域问题。

【讨论】:

    【解决方案2】:

    为什么是“跨域”?这些文件存放在同一个目录下!

    因为 Chrome 认为 所有 file:// URL 是相互跨域的。

    如何从运行脚本的同一源/目录打开本地文件?

    来自 Chrome?你没有。除非您使用命令行选项完全禁用 CORS(这是一个坏主意,因为很容易忘记您已经设置了该命令行选项并去网上冲浪,从而让自己对利用事实上你已经禁用了网络安全)。

    其他浏览器可能会以不同方式对待来源null

    相反,运行本地 Web 服务器并通过本地 Web 服务器使文件可用。然后您可以访问它们,因为它将是同源 http URL,而不是 file URL。或者使用十几个框架中的任何一个,让你用 JavaScript(而不是使用浏览器)编写应用程序。或者提供文件的简单 NodeJS 脚本(大约 10 行长)。等等。

    【讨论】:

    • 所有“文件”都是跨域的?非常聪明和聪明的设计))))))))那么,没有办法制作这样的应用程序吗?当然,我确实有一台服务器,并且了解如何使用服务器来做到这一点,它是如此简单,但问题是,没有它是否有可能实现这一目标。在他们需要运行此垃圾的任何嵌入式 PC 上安装 Web 服务器是不真实的。而且这些电脑根本没有连接到网络。
    • @BbIKTOP:我回答了这个问题:你不能。 (并且在 Stack Overflow 上发誓是不行的。)请改用几种“使用 JavaScript 制作应用程序”解决方案中的任何一种。让您的系统使用 Node.js。或其他十几种类似解决方案中的任何一种。
    • @BbIKTOP PC 未连接到网络这一事实无关紧要。这个想法是在您的应用程序过程中运行嵌入式 Web 服务器。当应用程序关闭时它应该停止服务,因为它是应用程序的一部分,而不是网络上其他地方的另一个服务器。您将使用 80 以外的端口,因为您并没有真正尝试为 Internet 服务。例如:stackoverflow.com/questions/3001185/…
    • @t-j-crowder 你说我可以安装服务器。我当然知道我可以! )))))) 只需写清楚“不可能”,这将是一个很好的答案
    • @ThisClark 你真的认为在超过 100 台嵌入式电脑上安装网络服务器来运行宣传视频是个好主意吗? ))))))))))
    【解决方案3】:

    读取 .json 文件的方法是将其声明为 .js。

    data.js

    var data = `{"value1": 10, "value2": "hello"}`
    

    index.html

    <script src="data.js"></script>
    
    <script>
      console.log(JSON.parse(data))
    </script>
    

    这将打印出来

    Object {value1: 10, value2: "hello"}
    

    它们必须在同一个目录中,否则你必须更改 data.js 的导入。

    【讨论】:

    • 为什么,我可以把它放在同一个文件中,为什么我需要使用data.js?就像 ' '
    • @BbIKTOP 因此,您可以将数据与源代码分开。这个想法是使用 data.js 作为假设的 data.json。如果必须将“v2”值更改为 3,则无需打开源代码即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 2019-02-27
    • 2013-12-05
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    相关资源
    最近更新 更多