在浏览器端,打开本地 html 文件,执行 JavaScript 修改本地文件内容的方式,有什么方式么?

2020-06-14 10:19:10 +08:00
 tctc4869

浏览器为了用户安全考虑,不让 JavaScript 修改本地文件内容,

但是我只想在本地用浏览器打开本地的一个 html 文件,在打开后的 html 界面点击按钮,执行某个功能,该功能是用 js 代码修改本地文件内容,这个有没有方法?必须要 node.js 么?

比如我想载浏览器端打开 html 文件,点击按钮修改一个相对于打开的 html 文件中同目录下的.json 文件内容。有什么好方法么。必须要用 ie 或 node.js ?谷歌,火狐不行么?需要什么配置么?或者 js 有什么数据库么?能在浏览器端打开一个本地 html 文件,执行 js 代码就能增删改查?

我想制作一些基于浏览器端打开本地 html 文件,就能执行的脚本应用,需要用本地持久化功能,所以想要用 JavaScript 。不考虑跨平台。windows 就行。

5981 次点击
所在节点    JavaScript
39 条回复
XanderChen
2020-06-14 10:22:33 +08:00
没有,不行,必须上框架。

想啥呢!
musi
2020-06-14 10:23:43 +08:00
不知道 FileReader 适不适合你
miniwade514
2020-06-14 10:24:23 +08:00
可以查一下 Chrome 插件 API 文档,看有没有相关接口。正常网页肯定不能直接写文件的。
whypool
2020-06-14 10:28:14 +08:00
可以的,但是只能 file 方式打开,可以用 reader 读取相对路径资源
duan602728596
2020-06-14 10:28:22 +08:00
别问,问就是 electron 和 nwjs 。浏览器不能修改本地文件,这是底线
noe132
2020-06-14 10:30:51 +08:00
假设浏览器能够在没有你的允许下访问你的本地文件,这样的浏览器你敢用吗?
xiaoming1992
2020-06-14 10:31:19 +08:00
利用 Blob 生成一个 json 文件,下载覆盖原来的 json 就好了

https://developer.mozilla.org/zh-CN/docs/Web/API/Blob
cw2k13as
2020-06-14 10:54:27 +08:00
必须要 node 啊,看了你的需求可以曲线救国,先导入再编辑再导出???
SuperMild
2020-06-14 10:59:39 +08:00
electron 就是因为解决了这个问题,所以才会这么火。

首先因为用 html 、js 来写界面非常方便,因此会有很多人想这样做,然后正如上面有人所说浏览器如果允许这个功能,这个浏览器就没人敢用了,因此才会冒出来一个 electron 。
cmdOptionKana
2020-06-14 11:12:29 +08:00
浏览器自带数据库,但是只能临时用,不能持久化。持久化可以用导出 json 的方法,这里有个例子 /t/648561
shansing
2020-06-14 11:26:04 +08:00
不行,浏览器不能无限制读写用户本地文件。如果要用 Web API 操作文件,必须是用户所选文件才行(使用 input[type="file"] 或者拖拽)。也不能直接写回。我毕设做了类似的东西,是弹出对话框让用户下载,从而达到保存的目的。

如果是本地持久化,考虑 LocalStorage ?
shansing
2020-06-14 11:39:19 +08:00
*如果不怕非标准化的 API,倒是有 FileWriter 之类的东西。
meathill
2020-06-14 12:05:42 +08:00
如果不是非要保存到本地文件系统,可以考虑直接写到 localStorage 里,空间不够的话用 indexedDB 。然后用户想导出的时候,再利用 `<a download>` 触发下载。
tctc4869
2020-06-14 12:13:02 +08:00
@noe132
@SuperMild
我打开的是我本地的 html 文件,又不是网络请求渲染的 html 。这都不行么?
buffzty
2020-06-14 12:14:19 +08:00
首先你要安装你自己的一个软件.并新建一个协议. 然后在 html 中 a 标签的链接改为 youapp://xxx?a=1&b=2 调用本地 exe 程序去执行代码 浏览器是个沙盒 ,他不开放 你只能在他里面做事
Jirajine
2020-06-14 12:23:44 +08:00
直接套 electron
DOLLOR
2020-06-14 13:06:21 +08:00
结论:不行。
浏览器的 JS 是运行在沙箱里的,不能随意访问用户的本地存储设备。能够满足你这种需求的浏览器,都因为安全问题被淘汰了。比如当年的 IE 浏览器,访问一个网站,就能往你的硬盘读写东西,非常可怕。

所以,现代浏览器,要有用户的授权,才能允许你从硬盘读取或写入文件。那就是打开对话框和保存对话框。
借助<input type="file">和 fileReader,你可以在用户授权的情况下读取硬盘里的文件。
然后借助<a download>,把修改后的文件写入磁盘。

当然,浏览器还提供了 localStorage 、sessionStorage 、IndexedDB 这些持久化或临时存储,保存在浏览器的沙箱里,浏览器以外是看不到的。

如果你想像应用程序一样随意读写硬盘,就不能只靠浏览器了,得上 node.js 或 electron 。

参见:
[https://developer.mozilla.org/en-US/docs/Web/API/File/Using_files_from_web_applications] 的 Accessing selected file(s),

[https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a] 的 Using the download attribute to save a <canvas> as a PNG 。
DOLLOR
2020-06-14 13:43:17 +08:00
<textarea style="width: 90%;height: 300px;"></textarea>
<br>
<input type="file">
<a href="#" download="">保存</a>
<script>
document.querySelector('input[type=file]').addEventListener('change', function () {
let file = this.files[0];
let fr = new FileReader();
fr.readAsText(file);
fr.onload = function () {
document.querySelector('textarea').value = this.result;
document.querySelector('a[download]').download = file.name;
};
});

document.querySelector('a[download]').addEventListener('mouseover', function () {
this.href = 'data:text/plain,' + encodeURIComponent(document.querySelector('textarea').value);
});
</script>
Vegetable
2020-06-14 13:52:22 +08:00
读文件可以实现,下载修改过的文件也可以实现,唯独是修改现有文件无法实现。前两个用户点两下能操作的,第三个是无论如何也没办法直接实现的。
Lightbright
2020-06-14 14:00:14 +08:00
国际主流浏览器是无论如何也不可能有提供修改本地文件的接口的,甚至如果你找到了这样的 BUG,可以直接向 Chrome 提供反馈,得到美金奖励。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/681395

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX