将checkbox未选中将设置为指定值并系列化,解决checkbox未选中不传递值问题

Posted Hello World,

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将checkbox未选中将设置为指定值并系列化,解决checkbox未选中不传递值问题相关的知识,希望对你有一定的参考价值。

(function ($) {
    
    //将checkbox未选中将设置为指定值并系列化
    jQuery.fn.extend({
        serializeWithCheckbox: function (uncheckedValue) {
            return jQuery.param(this.serializeArrayWithCheckbox(uncheckedValue));
        },
        serializeArrayWithCheckbox: function (uncheckedValue) {
            var
                rCRLF = /\\r?\\n/g,
                rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
                rsubmittable = /^(?:input|select|textarea|keygen)/i,
                rcheckableType = (/^(?:radio)$/i);  //仅将radio设置为不发送未选中项

            //未指定的转换为false
            if (uncheckedValue == undefined)
                uncheckedValue = 'false'
            uncheckedValue = uncheckedValue + '';//转字符串

            return this.map(function () {

                // Can add propHook for "elements" to filter or add form elements
                var elements = jQuery.prop(this, "elements");
                return elements ? jQuery.makeArray(elements) : this;
            })
                .filter(function () {
                    var type = this.type;

                    // Use .is( ":disabled" ) so that fieldset[disabled] works
                    return this.name && !jQuery(this).is(":disabled") &&
                        rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) &&
                        (this.checked || !rcheckableType.test(type));
                })
                .map(function (_i, elem) {
                    var val = jQuery(this).val();

                    if (val == null) {
                        return null;
                    }
                    //将未勾选的checkbox值设置为指定值
                    if (this.type == 'checkbox' && this.checked == false)
                        val = uncheckedValue;

                    if (Array.isArray(val)) {
                        return jQuery.map(val, function (val) {
                            return { name: elem.name, value: val.replace(rCRLF, "\\r\\n") };
                        });
                    }

                    return { name: elem.name, value: val.replace(rCRLF, "\\r\\n") };
                }).get();
        }
    });
})(jQuery);

因表单默认不会提交未选中的checkbox,通常的做法是生成一个隐藏的input,当未选中时设置为某个值,但操作比较麻烦,jQuery系列化时也是根据表单的行为来处理的。实际情况可能需要提交未选中的值并设置为某个特定的内容。这段代码增加了一个serializeWithCheckbox函数,用于处理此问题。

调用方法:$('#formid或者其他选择器').serializeWithCheckbox(默认值);

以上是关于将checkbox未选中将设置为指定值并系列化,解决checkbox未选中不传递值问题的主要内容,如果未能解决你的问题,请参考以下文章

PHP JQuery Checkbox - 如果复选框被预先选中,它不会在未选中时删除“选中”属性

angularjs实现checkbox的点击-全选功能-选中数据

在ext中如何动态设置checkbox的checked属性!

UITableViewCell未选中时如何将其背景视图设置为选中的背景?

怎么将checkbox,radio,select控件设置为只读,不可选

为属性设置默认值并使其可序列化