javascript - 在更改时从表单生成 JSON 字符串以填充营业时间
问题描述
我有以下 html 输入
<form id="test" role="form">
<input class="form-control" data-day="monday" type="time" name="open" value="12:00">
<input class="form-control" data-day="monday" type="time" name="close" value="20:00">
<!-- Rest of the weekdays -->
<input class="form-control" data-day="sunday" type="time" name="open" value="12:00">
<input class="form-control" data-day="sunday" type="time" name="close" value="23:00">
</form>
<pre id="output"></pre>
我尝试根据输入(更改时)生成一个 JSON 字符串。我的代码的问题是它更新(并且仅)我更改星期天时其他日子的值。
如果我在前几天做出改变什么都没有发生,我有点明白它为什么会失败,但现在让我头疼不已。
function toJSONString(form) {
var daysObj = {}
var hoursObj = {};
var elements = form.querySelectorAll("input[type='time']");
for (var i = 0; i < elements.length; ++i) {
var element = elements[i];
var days = element.dataset.day;
var name = element.name;
var value = element.value;
//if (days) {
//if (name) {
hoursObj[name] = value;
//}
daysObj[days] = hoursObj;
//}
}
return JSON.stringify(daysObj, null, 2);
}
document.addEventListener("DOMContentLoaded", function() {
var form = document.getElementById("test");
var output = document.getElementById("output");
form.addEventListener("change", function(e) {
e.preventDefault();
var json = toJSONString(this);
output.innerHTML = json;
}, false);
});
<form id="test" role="form">
<input class="form-control" data-day="monday" type="time" name="open" value="12:00">
<input class="form-control" data-day="monday" type="time" name="close" value="20:00">
<!-- Rest of the weekdays -->
<input class="form-control" data-day="sunday" type="time" name="open" value="12:00">
<input class="form-control" data-day="sunday" type="time" name="close" value="23:00">
</form>
<pre id="output"></pre>
解决方案
使用input
事件而不是change
事件change
仅在输入失去焦点后发生。input
每次输入值更改时都会触发事件
form.addEventListener("input",function(){})
您还每天使用相同的 hours 对象。因此,每次迭代您只是更改相同的对象open
和close
属性。
您需要在hoursObj
为该对象设置当天的最后一个属性之后创建一个新对象,在您的情况下,在设置之后close
for (var i = 0; i < elements.length; ++i) {
//previous code
//...
if(name=="close"){
hoursObj = {};
}
}
演示
function toJSONString(form) {
var daysObj = {}
var hoursObj = {}
var elements = form.querySelectorAll("input[type='time']");
for (var i = 0; i < elements.length; ++i) {
var element = elements[i];
var days = element.dataset.day;
var name = element.name;
var value = element.value;
hoursObj[name] = value;
daysObj[days] = hoursObj;
if(name=="close"){
hoursObj = {};
}
}
return JSON.stringify(daysObj);
}
document.addEventListener("DOMContentLoaded", function() {
var form = document.getElementById("test");
var output = document.getElementById("output");
form.addEventListener("input", function(e) {
e.preventDefault();
var json = toJSONString(this);
output.innerHTML = json;
}, false);
});
<form id="test" role="form">
<input class="form-control" data-day="monday" type="time" name="open" value="12:00">
<input class="form-control" data-day="monday" type="time" name="close" value="20:00">
<!-- Rest of the weekdays -->
<input class="form-control" data-day="sunday" type="time" name="open" value="12:00">
<input class="form-control" data-day="sunday" type="time" name="close" value="23:00">
</form>
<pre><code id="output"></code></pre>
推荐阅读
- ssl - 如何从 uapi 命令结果中导出 cab crt、key
- python - Apache Airflow 不断重复 DAG
- javascript - 在响应式菜单之外单击不会正确关闭导航栏
- scala - 无法解析带有流源的查询必须使用 writeStream.start() Scala 执行
- ios - Swift • UIDocumentPicker 适用于 iOS 和 iPadOS,但不适用于 Mac Catalyst 版本
- node.js - Req.Headers 值在生产中被视为空,而它在 localhost 上工作正常
- jit - 是否可以 jit 使用 jax.numpy.unique 的函数?
- python - 如何在python的数据库表中获取集群中心的索引?
- typescript - Typescript:如何从泛型函数类型中提取返回类型
- javascript - 在 VUE 中将数据从父级传输到子级并返回