在获取表单中数据的值时,经常用到 jQuery 的serialize()
方法,然而这个方法在某些情况下却获取不到需要的值,比如当属性设置为 disabled 时、当 checkbox、radio 没有选中时,这些情况下值都不会被获取。如果不能正常获取,有时会影响到我们的后续流程。
我们不可能把未选中的 dom 全部修改为已选中,这是不符合我们业务需求的,我们要根据是否选中实现后续逻辑。但我们也不可能直接修改 jQuery 的源码,这对于后续维护会带来很多麻烦。此时我们可以自己实现一个方法来解决问题,代码如下:
$.fn.serializeAll = function () {
var a = this.serializeArray()
var $radio = $('input[type=radio],input[type=checkbox]', this)
var temp = {}
$.each($radio, function () {
if (!temp.hasOwnProperty(this.name)) {
if ($("input[name='" + this.name + "']:checked").length == 0) {
temp[this.name] = ''
a.push({ name: this.name, value: 0 })
}
}
})
return jQuery.param(a)
}
// 调用代码,直接在原有代码的基础上把 serialize() 改成 serializeAll()
$(form).serializeAll()
如果你有不同的方案,可以在评论区说出来互动。