在没有web服务器的情况下使用Javascript加载本地文件
我需要写一个软件,使用HTML5和画布 整个软件应该能够在本地运行,而不需要服务器。所以我只能使用Javascript,不能使用php 困难的部分:我必须动态地获取操作过程中需要的文本文件的内容 例如:当软件启动时,我需要“config.json”。 在用户做出一些决定之后,我需要“story1.txt”或“story2.txt”等等 我的问题: 我不能使用Ajax,因为Chrome会阻止它——本地文件不允许获取其他文件的内容。我总是收到一条错误消息 到目前为止我所尝试的:在没有web服务器的情况下使用Javascript加载本地文件,javascript,jquery,ajax,Javascript,Jquery,Ajax,我需要写一个软件,使用HTML5和画布 整个软件应该能够在本地运行,而不需要服务器。所以我只能使用Javascript,不能使用php 困难的部分:我必须动态地获取操作过程中需要的文本文件的内容 例如:当软件启动时,我需要“config.json”。 在用户做出一些决定之后,我需要“story1.txt”或“story2.txt”等等 我的问题: 我不能使用Ajax,因为Chrome会阻止它——本地文件不允许获取其他文件的内容。我总是收到一条错误消息 到目前为止我所尝试的: 使用Ajax和jQ
- 使用Ajax和jQuery加载文件 Chrome不允许我加载该文件
- 将文件加载到脚本标记中 即使我将JSON文件声明为js代码,我也无法访问加载文件的内容
- 将文件加载到不可见的Iframe中,并读取其内容
加载工作正常,我可以看到代码。但当我尝试访问IFrame的内容时,我再次收到Chrome错误消息:
"Uncaught SecurityError: Blocked a frame with origin "null" from accessing a frame with origin "null". Protocols, domains, and ports must match."
有没有办法动态加载文本文件,或者我是被迫使用Web服务器的?如果您的要求允许,我会制作一个Chrome扩展。它们很容易制作,可以很好地为您服务 您必须将本地文件放在同一台服务器上。如果您在本地服务器上运行,则必须安装一些Web服务器作为Apache,才能访问您的“远程”位置 每个现代浏览器都会停止这种操作,因为您不能从任何用户处读取本地文件。
即使您是从本地主机运行 如果您坚持使用Chrome,它会有一些命令行标志来允许访问本地源文件(
--允许从文件访问文件
/--禁用web安全
)。请注意,您需要使用这些标志从头开始运行整个浏览器-即,如果已经有任何其他Chrome窗口打开标志将不会产生任何效果,并且这种效果将在所有窗口中持续,直到Chrome关闭,这显然是一个巨大的安全漏洞
如果使用某种自动设置脚本打包“应用程序”,则可以设置轻量级本地服务器。这仍然不是很好,因为您需要安装用户可能不想要的可执行文件,甚至由于限制而完全无法安装
您可以将基于HTML/JS的应用程序打包为Chrome扩展,扩展的权限比随机代码大得多,但您需要通过Google Play分发它,或者提供为用户手动安装扩展的说明
最后,您可以将所有数据(包括您提到的配置和文本文件)格式化为有效的JavaScript代码,即将story1.txt
打包为story1.js
,如:
var myapp.story1 = "Complete text of story1.txt"
然后,只需从相应的变量中动态选择所需的内容,甚至通过动态添加
标记,使用DOM操作只加载所需的脚本。在我看来,这将是最好的选择,因为它的侵入性较小:它不需要任何安装/重新配置,只是开箱即用。您正在描述的内容(以及建议的解决方案)严肃地说
应该能够在本地运行,而不需要服务器
那么软件是如何在机器上运行的呢?除非您打算在post中发送DVD,否则该软件的部署可以作为HTML5应用程序使用(所有现代浏览器都支持,包括Chrome和)。这不适合将数据存储为普通文件,但您可以将数据保存在本地存储中。我发现firefox将在本地运行html和js。您可以在Chrome浏览器中本地加载本地文件,而无需使用AJAX。您可以正常使用jQuery函数,如$.getJSON()在chrome浏览器中加载文件 但是如果您使用这个jQuery功能,那么chrome Web Security将阻止您访问文件格式文件包的功能。在Firefox浏览器上,它可以完美地运行,但是如果您的需求是chrome浏览器,那么您必须使用命令行设置一些chrome标志 下面是设置Chromium标志的一些步骤,它使您能够使用一些额外的功能,帮助您从本地系统访问数据文件。 这些是:
注意:记住您的标志现在只为这个chrome图标设置。因此,请使用此chrome图标启动应用程序。如果您只需要一个快速、简单的“合法”web服务器来欺骗您的浏览器,使其认为它不是从本地文件系统中提取的,只需使用Python的简单HTPP服务器即可。它只是根据请求从调用它的任何目录提供文件。服务器在其他方面是哑的。它不会执行PHP脚本或任何东西。以下是方法:
fetch("./config.json").then(function(res) {
// res instanceof Response == true.
if (res.ok) {
res.json().then(function(data) {
console.log(data);
});
} else {
console.log("Looks like the response wasn't perfect, got status", res.status);
}
}, function(e) {
console.log("Fetch failed!", e);
});