提问人:MichaelMitchell 提问时间:2/18/2021 更新时间:2/19/2021 访问量:85
如何序列化取消选中复选框?
How do I serialize the unchecking of checkboxes?
问:
我正在尝试使用 unobtrusive-ajax 来允许网站将其内容更新为 AJAX(如果 JavaScript 可用)和静态页面(如果没有)。我想支持浏览器的按钮在历史记录中向后移动。Back
我正在使用 JavaScript 的历史记录 API 在用户浏览网站时操作浏览器历史记录。我将 HTML(通过)和 DOM 的当前状态(通过 JQuery 的方法)存储在 history 对象中。当用户点击 时,HTML 和 DOM 将分别从缓存的 HTML 和序列化的 DOM 中恢复。innerHTML
serialize
Back
但是,我丢失了有关在页面加载 () 时选中但用户未选中的复选框的信息。"checked"="checked"
根据 JQuery 文档,网址为 https://api.jquery.com/serialize/
复选框和单选按钮(类型为“radio”或“checkbox”的输入)中的值仅在选中时才包括在内。
此处的“值”是指选中状态,而不是复选框的状态。value
这是一个错误的设计吗?当它与 HTML 不同时,它不应该包含检查值吗?
有条件序列化的其他元素上是否有其他属性?
答:
无论您正在尝试的浏览器历史记录操作历史记录如何......这里的主要做法是实时保存复选框状态,因此每次 JS 运行时,您都会检索保存的值。
保存复选框的状态可以通过 localStorage 完成。
下面的内容在页面重新加载时可以完美运行。您的历史记录操作应该绕过后退按钮的“正常”行为这一事实,以免再次运行 JS。我把它留给你。;)
// Check box state array
let checkboxesState = []
// If that is the very first page load and there is no local storage.
if(localStorage.getItem("checkedCheckboxes") === null){
$("input[type='checkbox']").each(function(index){
checkboxesState.push(this.checked)
// Add a data attribute for the index of the checkbox
this.setAttribute("data-chk_index",index)
})
// Save
localStorage.setItem("checkedCheckboxes", JSON.stringify(checkboxesState))
}
// If there already is a checkbox state storage
else{
checkboxesState = JSON.parse(checkboxesState)
$("input[type='checkbox']").each(function(index){
this.checked = checkboxesState[index]
// Add a data attribute for the index of the checkbox
this.setAttribute("data-chk_index",index)
})
}
// Update the array on click
$("input[type='checkbox']").on("click", function(){
checkboxesState[this.getAttribute("data-chk_index")] = this.checked
// Update Storage
localStorage.setItem("checkedCheckboxes", JSON.stringify(checkboxesState))
// That is the current state of the saved array
console.log(localStorage.getItem("checkedCheckboxes"))
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="checkbox">
<input type="checkbox" checked>
<input type="checkbox">
检查我的 CodePen,因为 SO 片段中不允许使用。localStorage
JQuery 用于序列化表单以提交到服务器,除非另有说明,否则假定不会选中复选框。serialize
问题在于,在应用序列化字符串中的属性之前,https://github.com/kflorence/jquery-deserialize/ 没有清空属性。deserialize
我通过在应用反序列化之前取消选中所有复选框来解决此问题。
document.getElementById("thepage").innerHTML = stateHtml;
$("#thepage input[type='checkbox']").prop("checked", false);
$("#thepage").deserialize(stateDomSerialized);
评论