2017-01-20 65 views
1

请告诉我,为什么本地javascript无法打开本地文件? 我试图创建一个简单的JavaScript/HTML应用程序,应该从本地文件系统在本地机器上运行。这个应用程序试图读取配置文件中使用不同的方法(JSON),但得到以下错误(铬):本地javascript无法打开本地文件

  1. 在XMLHttpRequest的情况下,方法open("GET", filename, true)抛出一个异常:

    的XMLHttpRequest无法加载文件:/// bla-bla-bla。协议方案仅支持交叉源请求:http,data,chrome,chrome-extension,https,chrome-extension-resource。

  2. document.createElement("iframe").src=filename情况下,我有另一个异常:

    VM596:1未捕获的抛出:DOMException:未能读取从 'HTMLIFrameElement' 的 'contentDocument' 属性:被阻止与原籍 “空” 帧从访问跨域框架。”

  3. var f=new File([], filename, { type: "text/plain" });情况下,我已经得到了与零的大小,并在所有没有错误的文件对象。的FileReader返回一个空的结果,那么,

所以,我的问题是: 为什么它是“跨源”?这些文件存储在同一个目录中! 我怎么能打开来自我运行该脚本相同的来源/目录的本地文件? 请帮忙。

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

+2

'file://协议真的有一个非常有限的用法,用于测试或查看一个单独的文件。对于真正的webapp测试,你需要建立一个小型的,基本的“web服务器”程序,它可以向'localhost/index.html'或'localhost/bla-bla-bla.js'发送请求。例如,Python可以让你通过命令行在python -m SimpleHttpServer 80上设置一个文件夹 – Katana314

+0

@BbIKTOP,tou可以将JSON文件转换成一个javascript文件(将'var myVariable ='添加到开头json文件),然后使用''将数据包含在'myVariable'(对象)中。虽然不是最好的解决方案,但可行。 –

+0

他们有更多的100个没有局域网,运行非常具体的软件(健身房),这个应用程序旨在显示一些广告videoclips。 这就是为什么它不可能与web服务器一起使用这样一个明显的解决方案,这就是为什么我在这里问这个问题。 当然,可以不使用json配置,而是将配置放入代码中,也许放在单独的文件中。这并不有趣,因此无需在此处询问或讨论。 – BbIKTOP

回答

1

你可以做什么来阅读你的。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"} 

他们都必须在同一目录下,否则你必须改变我数据的一部分

+0

为什么我可以把它放在同一个文件中,为什么我需要使用data.js? 就像 ' ' – BbIKTOP

+0

@BbIKTOP因此,您将您的数据与源代码分开。这个想法是使用data.js作为假设的data.json。如果您必须将“v2”值更改为3,则无需打开源代码。 –

+0

这将是代码,而不是数据 – BbIKTOP

4

为什么它是“交叉来源”?这些文件存储在同一个目录中!

由于Chrome认为所有file://网址是跨源到彼此。

我怎么能从同一个来源/目录打开本地文件我运行脚本?

从Chrome?你没有。除非你完全使用命令行选项来禁用CORS(这是一个糟糕的主意,因为它很容易忘记你已经设置了命令行选项并上网冲浪,让你自由开放以利用事实上你已经禁用网络安全)。

其他浏览器可能会以不同的方式处理原产地null

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

+0

所有“文件”都是交叉元素?非常聪明和聪明的设计))))))) 所以,没有办法让这样的应用程序? 当然,我有一台服务器,并明白如何用服务器做到这一点,这很简单,但问题是,没有它,是否有可能实现这一目标。将Web服务器安装在任何他们需要运行这个垃圾的嵌入式PC上是不真实的。而这些电脑根本没有连接到网络。 – BbIKTOP

+0

@BbIKTOP:我回答了这个问题:你不能。 (并且Stack Overflow上的脏话不好)使用任何一种“用JavaScript创建应用程序”解决方案。让你的系统使用Node。或者其他十几种类似的解决方案。 –

+1

@BbIKTOP PC未连接到网络的事实是无关紧要的。这个想法是在应用程序进程期间运行嵌入式Web服务器。它应该在应用程序关闭时停止服务,因为它是应用程序的一部分,而不是网络中其他位置的另一台服务器。你会使用80以外的端口,因为你并不是真的想要上网。参见例如:http://stackoverflow.com/questions/3001185/what-is-the-recommended-way-of-running-a-embedded-web-server-within-a-desktop-ap – ThisClark