【发布时间】:2016-01-07 23:02:04
【问题描述】:
我正在开发一个完全在本地运行的 Web 应用程序,该应用程序无需任何网络连接即可运行。这个想法是向将使用该应用程序基本上填写一堆表单字段和图表的用户(约 40 人)分发一个包。随着对页面的更改,一个带有 JSON 格式数据的对象被填充。我的页面现在运行良好,我有一个函数来加载现有的 JSON 文件并填充文件中存在的任何字段。这背后的想法是,某人可以在填写应用程序中的字段“中途”,或者某人可以加载以前的工作。
我的问题是;什么是可用于从网页获取数据到 JSON 文件并能够将其保存到本地计算机以便以后分发(通过电子邮件发送、保存到 SP、网络驱动器、访问数据库等)的最佳系统?将使用该应用程序的场景是严格无网络访问区域,因此这就是我需要能够在本地保存和访问文件的原因。我有一个半解决方案,我可以在其中打开一个包含文件内容的单独选项卡,但我真的更愿意为我完成下载/保存提示,因为大多数用户不会比看到一个乱码页面更进一步它。
我必须完成的代码是:
//Download file
function SaveToDisk() {
var data = JSON.stringify(currentSession);
var fileURL = 'data:text/json;charset=utf8,' + encodeURIComponent(data);
var fileName = $('file-save').val();
console.log(fileURL);
// for non-IE
if (!window.ActiveXObject) {
var save = document.createElement('a');
save.href = fileURL;
save.target = '_blank';
save.download = fileName || 'unknown';
var event = document.createEvent('Event');
event.initEvent('click', true, true);
save.dispatchEvent(event);
(window.URL || window.webkitURL).revokeObjectURL(save.href);
}
// for IE
else if ( !! window.ActiveXObject && document.execCommand) {
var _window = window.open(fileURL, '_blank');
_window.document.close();
_window.document.execCommand('SaveAs', true, fileName || fileURL)
_window.close();
}
}
currentSession 对象如下所示:
//Global JSON variables
var currentSession = {
"sections":{
"header":{
"tool":"",
"subsystem":"",
"engineer":"",
"date":"",
"so":""
},
"whys":{
"why1":{
"error":"",
object:"",
norm:"",
},
why2:{
error:"",
object:"",
norm:"",
},
why3:{
error:"",
object:"",
norm:"",
},
why4:{
error:"",
object:"",
norm:"",
},
why5:{
error:"",
object:"",
norm:"",
}
},
probDescription:{
"F":{
"is":"",
"isnot":""
},
"O":{
"is":"",
"isnot":""
},
"T":{
"is":"",
"isnot":""
},
"L":{
"is":"",
"isnot":""
},
"P":"",
"W":"",
"Pos":"",
"S":""
},
possibleCauses :{
"data":""
},
notes: ""
}
};
更新:在 IE9 上的 windows 机器上尝试此操作(到目前为止一直在 mac 上测试)会出现以下错误:
SCRIPT5007: Unable to get value of the property 'document': object is null or undefined
在上面代码的下面一行:
_window.document.close();
检查前线:
// for IE
else if ( !! window.ActiveXObject && document.execCommand) {
告诉我 if 语句检查是否存在 activeXObject(仅在 IE 中???)和其他东西(div 可编辑???)为真,然后它与 IE 解决方案一起使用。
然后它会创建一个带有数据 url 的新窗口(不确定这里的 '_blank' 是什么)并尝试保存文件。那么为什么 _window.document 行会出错呢?它确实会打开一个新窗口,其 URL 为:
data:application/octet-stream;{data}
这里的任何帮助也非常感谢(并且需要)
欢迎所有帮助和建议,因为我对这一切还很陌生,还在学习中。
提前谢谢
【问题讨论】:
-
您可以安装本地 PHP 服务器(WAMP 等)并使用
json_encode和file_put_contents将数据保存在本地。与完全在 JS 中相比,它还可以让您更有效地处理数据。 -
在此链接 html5rocks.com/en/tutorials/offline/storage,您可以找到一些“本地存储解决方案”及其优缺点,您可以比较它们,从而为您的应用找到最佳方式。
-
我看了看,但无法让它工作,所以假设它不适合我的情况 - 我如何将它应用于我当前的情况?将 jquery 放在 HTML 正文的开头,然后使用按钮“单击”链接?
-
@AndrewCoder 是否有任何可移植、轻量级的非管理员权限,需要可以轻松分发的 Web 服务器?我今天用谷歌搜索了这个,我不确定我到底在寻找什么,但找不到任何符合该标准的东西。你能提出一些建议吗?干杯
标签: javascript html json