javascript - 如何导出表单数据
问题描述
我是 JS 的新手,正在学习如何在单击特定表单的提交按钮时导出数据,我的代码如下所示:
var stockData = [
{
Email:document.getElementById("email").value,
Password: document.getElementById("pwd").value,
Name: document.getElementById("name").value,
}
];
function downloadCSV(args) {
var data, filename, link;
var csv = convertArrayOfObjectsToCSV({
data: stockData
});
if (csv == null) return;
filename = args.filename || 'export.csv';
if (!csv.match(/^data:text\/csv/i)) {
csv = 'data:text/csv;charset=utf-8,' + csv;
}
data = encodeURI(csv);
link = document.createElement('a');
link.setAttribute('href', data);
link.setAttribute('download', filename);
link.click();
}
但是,当我导出数据时,即使我在字段中输入值,我总是会变空。感谢任何帮助。
解决方案
这是因为您在加载 js 时而不是在用户单击按钮时获取字段值。
注意stockData
变量声明。我把它移到了 function downloadCSV()
。
这是工作解决方案
function convertArrayOfObjectsToCSV(args) {
var result, ctr, keys, columnDelimiter, lineDelimiter, data;
data = args.data || null;
if (data == null || !data.length) {
return null;
}
columnDelimiter = args.columnDelimiter || ',';
lineDelimiter = args.lineDelimiter || '\n';
keys = Object.keys(data[0]);
result = '';
result += keys.join(columnDelimiter);
result += lineDelimiter;
data.forEach(function(item) {
ctr = 0;
keys.forEach(function(key) {
if (ctr > 0) result += columnDelimiter;
result += item[key];
ctr++;
});
result += lineDelimiter;
});
return result;
}
function downloadCSV(args) {
var data, filename, link;
var stockData = [{
Email: document.getElementById("email").value,
Password: document.getElementById("pwd").value,
Name: document.getElementById("name").value,
}];
var csv = convertArrayOfObjectsToCSV({
data: stockData
});
if (csv == null) return;
filename = args.filename || 'export.csv';
if (!csv.match(/^data:text\/csv/i)) {
csv = 'data:text/csv;charset=utf-8,' + csv;
}
data = encodeURI(csv);
link = document.createElement('a');
link.setAttribute('href', data);
link.setAttribute('download', filename);
link.click();
}
<link rel="icon" href="https://image.ibb.co/fb4f8y/Test_Form_Icon.png" type="image/gif" sizes="16x16">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<div class="container">
<h2>TestFormData</h2>
<form class="form-horizontal" action="">
<div class="form-group">
<label class="control-label col-sm-2" for="email">Email:</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="email" placeholder="Enter email" name="email">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="pwd">Password:</label>
<div class="col-sm-10">
<input type="password" class="form-control" id="pwd" placeholder="Enter password" name="pwd">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="email">Name:</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="name" placeholder="Enter name" name="name">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default" onclick='downloadCSV({filename: "data.csv"});'>Submit</button>
</div>
</div>
</form>
</div>
推荐阅读
- node.js - 撇号 cms 中图像的默认值?
- docker - 带有存储库 ibm-messaging/mq-container 的 IBM-MQ Docker
- javascript - 将 JSArray 从 HTML 传递到 Javascript
- ruby - Ruby shell:如何停止执行 REPL 复制粘贴?
- node.js - Mongo/express 无法加载路线(邮递员中出现意外的“<”)
- c++ - 在 C++ 中的对象实例化时声明一个数组
- javascript - jqgrid中的确认框
- python - Python 类返回“无”(不可取)
- sql - 识别具有最大连续值的行
- javascript - 使用 node.js 通过链接创建私人房间