反映 DOM 属性 将输入复选框更改为 innerHTML 属性
Reflect DOM property change of input checkbox into innerHTML attribute
我有一个包含内容可编辑元素和复选框的网络表单,在提交时 returns 周围 div 的内部 HTML(对此我无能为力)。
出于明显的原因,这意味着提交了 contenteditable 元素的更改,而复选框状态的更改则没有,因为作为 DOM 属性,它们不是 HTML 属性的一部分。
我找到了一个相对简单的解决方法,就是将点击事件附加到复选框周围的元素并修改内部HTML。
像这样:http://jsfiddle.net/9Lkoaq3y/
$( ".checkboxes" ).click(function() {
if (this.firstChild.checked) this.innerHTML=this.innerHTML.split("input").join("input checked=\"checked\"");
else this.innerHTML=this.innerHTML.split("checked=\"checked\" ").join("");
});
不过,我想知道是否有一种更安全、更优雅和通用的方法来解决这个问题,这种方法也适用于其他表单元素。
简而言之,我不喜欢我丑陋的技巧。
这里有人问了一个相关问题:innerHTML not being updated after changing value of input (checked = true/false/"checked") 但没有一个优雅的解决方案。
我能找到的最简单的解决方案(只是为了结束这个悬而未决的问题)是将选中的 属性 写入所有复选框和单选按钮的选中属性,每次其中一个更改值时。
这个简短的 jquery 代码负责处理此问题,并确保只有那些输入元素的属性在 属性 和属性尚未对应的情况下发生更改。
$("input[type=checkbox], input[type=radio]").change(function () {
$("input[checked='checked']:not(:checked)").each(function (index) {
$(this).removeAttr('checked');
});
$("input:not([checked='checked']):checked").each(function (index) {
$(this).attr('checked', 'true');
});
});
我有一个包含内容可编辑元素和复选框的网络表单,在提交时 returns 周围 div 的内部 HTML(对此我无能为力)。 出于明显的原因,这意味着提交了 contenteditable 元素的更改,而复选框状态的更改则没有,因为作为 DOM 属性,它们不是 HTML 属性的一部分。
我找到了一个相对简单的解决方法,就是将点击事件附加到复选框周围的元素并修改内部HTML。
像这样:http://jsfiddle.net/9Lkoaq3y/
$( ".checkboxes" ).click(function() {
if (this.firstChild.checked) this.innerHTML=this.innerHTML.split("input").join("input checked=\"checked\"");
else this.innerHTML=this.innerHTML.split("checked=\"checked\" ").join("");
});
不过,我想知道是否有一种更安全、更优雅和通用的方法来解决这个问题,这种方法也适用于其他表单元素。 简而言之,我不喜欢我丑陋的技巧。
这里有人问了一个相关问题:innerHTML not being updated after changing value of input (checked = true/false/"checked") 但没有一个优雅的解决方案。
我能找到的最简单的解决方案(只是为了结束这个悬而未决的问题)是将选中的 属性 写入所有复选框和单选按钮的选中属性,每次其中一个更改值时。
这个简短的 jquery 代码负责处理此问题,并确保只有那些输入元素的属性在 属性 和属性尚未对应的情况下发生更改。
$("input[type=checkbox], input[type=radio]").change(function () {
$("input[checked='checked']:not(:checked)").each(function (index) {
$(this).removeAttr('checked');
});
$("input:not([checked='checked']):checked").each(function (index) {
$(this).attr('checked', 'true');
});
});