如何为未选中的复选框序列化数组?
How can I serializeArray for unchecked checkboxes?
我如何修改这个例子,使它可以从未选中的复选框中获取值?
我想让所有的复选框都有一个值,如果它没有被选中,我想让它的值为false
。
<input type="checkbox" name="Check01" value="true" />
<input type="checkbox" name="Check02" value="true" checked="checked" />
默认行为
$("form").serializeArray();
// [Check02 = true]
预期行为$("form").serializeArray();
// [Check01 = false, Check02 = true]
自己动手可能是最简单的:
var serialized = $('input:checkbox').map(function() {
return { name: this.name, value: this.checked ? this.value : "false" };
});
如果有其他输入,那么您可以序列化表单,然后使用类似于上面的方法找到未选中的复选框,并将结果附加到第一个数组。
serializeArray
忽略未选中的复选框。您可以尝试这样做。
var serializedObj = {};
$("form input:checkbox").each(function(){
serializedObj[this.name] = this.checked;
});
您可以使用此获取未检查值
$.fn.serializeObject = function () {
var o = {};
var a = this.serializeArray();
$.each(a, function () {
if (o[this.name] !== undefined) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
}
});
var $radio = $('input[type=radio],input[type=checkbox]',this);
$.each($radio,function(){
if(!o.hasOwnProperty(this.name)){
o[this.name] = '';
}
});
return o;
};
代码示例
另一种选择是查看serializeArray的源代码并删除(或修改)对filter的调用。我只是取了那个函数并创建了一个名为serializeArrayAll的新函数,像这样:
$.fn.serializeArrayAll = function() {
var rCRLF = /'r?'n/g;
return this.map(function(){
return this.elements ? jQuery.makeArray( this.elements ) : this;
})
/* this is what is excluding the unchecked checkboxes (and also other disabled options)
.filter(function(){
return this.name && !this.disabled &&
( this.checked || rselectTextarea.test( this.nodeName ) ||
rinput.test( this.type ) );
})
*/
.map(function( i, elem ){
var val = jQuery( this ).val();
return val == null ?
null :
jQuery.isArray( val ) ?
jQuery.map( val, function( val, i ){
return { name: elem.name, value: val.replace( rCRLF, "'r'n" ) };
}) :
{ name: elem.name, value: val.replace( rCRLF, "'r'n" ) };
}).get();
};
这是我如何实现$.serializeArray
的简单覆盖,它修复了复选框的默认序列化行为,并保留了所有其他类型的默认行为。
在下面的代码中,遗漏的复选框被注入到原始的序列化数组中。复选框状态返回"true"
(而不是"on"
)或"false"
取决于是否为checked
。
(function ($) {
var _base_serializeArray = $.fn.serializeArray;
$.fn.serializeArray = function () {
var a = _base_serializeArray.apply(this);
$.each(this.find("input"), function (i, e) {
if (e.type == "checkbox") {
e.checked
? a[i].value = "true"
: a.splice(i, 0, { name: e.name, value: "false" })
}
});
return a;
};
})(jQuery);
您可以自定义它以返回"on"/"off"
或true/false
。
更新:修复基于@shyammakwana.me.
你可以为每个复选框添加一个隐藏的false值:
<input type="checkbox" name="Check01" value="true" /><input name="Check01" type="hidden" value="false" />
<input type="checkbox" name="Check02" value="true" checked="checked" /><input name="Check02" type="hidden" value="false" />
未选中的复选框只会得到"false"值,选中的复选框会同时得到"true"answers"false"值,所以你可以像这样删除重复的复选框:
var params = {};
$.each($('form').serializeArray(), function (index, value) {
params[value.name] = params[value.name] ? params[value.name] || value.value : value.value;
});
console.log(params); // outputs: {"Check01":"false","Check02":"true"}
我根据@Pointy、@Ben的答案和原始jQuery代码制作了自己的新解决方案。来自@Pointy的答案有奇怪的行为,返回复选框的上下文,这解决了这个问题。@Ben的答案也没有正确运行,因为它总是返回checkbox = on
,即使它未被检查。
$.fn.serializeArrayWithCheckboxes = function() {
var rCRLF = /'r?'n/g;
return this.map(function(){
return this.elements ? jQuery.makeArray( this.elements ) : this;
})
.map(function( i, elem ){
var val = jQuery( this ).val();
if (val == null) {
return val == null
//next 2 lines of code look if it is a checkbox and set the value to blank
//if it is unchecked
} else if (this.type == "checkbox" && this.checked == false) {
return { name: this.name, value: this.checked ? this.value : ""}
//next lines are kept from default jQuery implementation and
//default to all checkboxes = on
} else {
return jQuery.isArray( val ) ?
jQuery.map( val, function( val, i ){
return { name: elem.name, value: val.replace( rCRLF, "'r'n" ) };
}) :
{ name: elem.name, value: val.replace( rCRLF, "'r'n" ) };
}
}).get();
};
使用jQuery插件serializeJSON,您可以使用data-unchecked-value
属性来指定未选中时的值:
<input type="checkbox" name="Check01" value="true" data-unchecked-value="false" />
<input type="checkbox" name="Check02" value="true" data-unchecked-value="false" checked="checked" />
JavaScript: $('input').serializeJSON({ parseBooleans: true });
// returns => { 'Check01' : false, 'Check02' : true }
@SNag的答案工作者几乎99%,只是稍微纠正一下。
下行更改:
$.each(this, function (i, e) {
:
$.each(this.find('input'), function (i, e) {
解释:由于this
返回表单元素,所以这不起作用。所以在form .each
上不会给我们form里面所有的输入元素。所以我做了这个修正,效果很好。
您可以将未选中的复选框数据附加到.serializeArray
result:
var formData = $("#mybaseelement").serializeArray();
$('#mybaseelement input[type="checkbox"]:not(:checked)').each(function(i, e) {
formData.push({name: e.getAttribute("name"), value: false});
});
Yet Another SerializeArray()
这个实现还是基于jQuery的原始代码,但是我需要它来处理一些Bootstrap的带有两个不同值的"switch"复选框。
$.fn.serializeArrayWC = function() {
var rCRLF = /'r?'n/g;
return this.map(function(){
return this.elements ? jQuery.makeArray( this.elements ) : this;
})
.map(function(i, elem){
if (this.type == "checkbox") {
// Bootstrap checkboxes with two different values.
if (jQuery(this).hasClass("switched")) {
// Always return value (either on-value or off-value).
return { name: this.name, value: this.value };
}
// Normal checkboxes. Unchecked checkboxed are not returned.
if (!this.checked) {
// This will be removed by the !!f filter, below.
return false;
}
// Return the value, or "on".
return { name: this.name, value: this.value||"on" };
}
var val = jQuery(this).val();
if (val == null) {
return { name: elem.name, value: null };
} else {
return jQuery.isArray(val) ?
jQuery.map( val, function( val, i ){
return { name: elem.name, value: val.replace( rCRLF, "'r'n" ) };
}) :
{ name: elem.name, value: val.replace( rCRLF, "'r'n" ) };
}
})
.filter(function(i, f){ return !!f; })
.get();
};
var fields = $("form").serializeArray();
$('form input[type=checkbox]').map(function() {
if( !this.checked )
{
fields.push({ name: this.name, value: "off" });
}
});
- 如何在angularJS中编辑时,如果DB中的值为true,则设置复选框,如果值为false,则取消选中复选框
- 正在验证8个真/假复选框或复选框中的2个
- 为复选框javascript指定两个值
- 如何在单击复选框后调用控制器方法
- JQUERY 验证 - 序列化选择和复选框
- jQuery 使用样式化的无线电和复选框验证插件
- 根据“复选框”重新着色文本,选择HTML+ JS中的数字和序列
- 如何反序列化复选框值的 JSON 数据
- 在 jquery 中序列化两个复选框
- 如何在点击复选框时检索现有的jquery数据表(在文档上初始化)
- 在谷歌可视化栏旁边添加复选框
- 取消复选框未进行可视化更新
- 序列化似乎会覆盖多个选择框和复选框上的值
- jquery dataable为对象初始化的表添加复选框
- Angularjs应用程序中文本框和复选框模型中触发跨度点击和观看事件序列时发生冲突
- Kendo UI -模板化一个复选框列表并将其绑定到viewModel
- 谷歌表可视化-过滤器上松散的复选框
- 如何为未选中的复选框序列化数组?
- $_GET没有反序列化/从选中的复选框中获取值
- 如何序列化复选框,单选和多个选择元素,如果他们是空白使用Jquery SerializeArray()