JavaScript之form表单的序列化和json化[form.js]

一、应用场景

    form提交时,使用ajax提交。

二、效果

    通过本工具,实现表单所有form的快速序列化和json化,使前端人员在ajax提交form表单的时,脱离重复性的,大劳动量的手动抽取form属性和对应的值。

三、源码[form.js]

    

//将数据序列化成 url请求方式的编码
function serialize(form){
    var len=form.elements.length;//表单字段长度;表单字段包括<input><select><button>等
    var field=null;//用来存储每一条表单字段
    var parts=[];//保存字符串将要创建的各个部分
    var opLen,//select中option的个数
        normalValue,//text,number,date,textarea的值
        opValue;//select中option的值
    //遍历每一个表单字段
    for(var i=0;i<len;i++){
        field=form.elements[i];
        /*检测每一个表单字段的类型,做出不同的处理:
        *1.最麻烦的就是select:它可能是单选框也可能是多选框,这里的代码适合于这两种框。在找到一个选中的项之后,需要确
        *定使用什么值。如果不存在value特性或者虽然存在但是值为空字符串,都要使用选项的文本来代替。为查这个属性,在DOM兼
        *容的浏览器中使用hasAttribute()方法,在IE中需要使用特性的specified属性。
        *2.表单中如果包括<fieldset>
        *元素,则该元素会出现在表单集合中但是没有type属性。因此,如果type属性未定义,则不必对其进行序列化;同样,对于
        *各种按钮以及文件输入字段都是如此。
        *3.对于单选按钮和复选框,要检查其checked属性是否被设置为false,如果是则退出switch语句,如果checked属性为true
        *则继续进行default内容,即将当前的名称和值进行编码,然后添加到parts数组中。函数的最后一步就是使用join格式化整
        *个字符串,也就是用和好来分隔每一个表单字段
        */
        switch(field.type){
            case"select-one":
            case"select-multiple":
                            if(field.name.length){
                                for(var j=0,opLen=filed.options.length;j<opLen;j++){
                                    option=field.options[j];
                                    if(option.selected){
                                        opValue=‘‘;
                                        if(option.hasAttribute){
                                            opValue=(option.hasAttribute(‘value‘)?option.value:option.text);
                                        }else{
                                            opValue=(option.hasAttribute[‘value‘].specified?option.value:option.text);//IE下
                                        }
                                        parts.push(encodeURIComponent(field.name) + ‘=‘ + encodeURIComponent(opValue));
                                    }

                                }
                            }
                            break;
            case undefined:
            case "file":
            case "submit":
            case "reset":
            case "button":
                        break;
            case "text":
            case "number":
            case "date":
            case "textarea":
                if(field.name.length){
                    normalValue = field.value;
                    parts.push(encodeURIComponent(field.name)+‘=‘+encodeURIComponent(normalValue));
                }
                break;
            case "radio":
            case "checkbox":
                if(!field.checked){
                    break;
                }
            default:
                if(field.name.length){
                    parts.push(encodeURIComponent(field.name)+‘=‘+encodeURIComponent(opValue));
                }
                break;
        }
    }
    return parts.join("&");
}
//将form数据字符串化成符合json格式的字符串
function stringify(form){
    var len=form.elements.length;//表单字段长度;表单字段包括<input><select><button>等
    var field=null;//用来存储每一条表单字段
    var parts=[];//保存字符串将要创建的各个部分
    var opLen,//select中option的个数
        normalValue,//text,number,date,textarea的值
        opValue;//select中option的值
    //遍历每一个表单字段
    for(var i=0;i<len;i++){
        field=form.elements[i];
        /*检测每一个表单字段的类型,做出不同的处理:
        *1.最麻烦的就是select:它可能是单选框也可能是多选框,这里的代码适合于这两种框。在找到一个选中的项之后,需要确
        *定使用什么值。如果不存在value特性或者虽然存在但是值为空字符串,都要使用选项的文本来代替。为查这个属性,在DOM兼
        *容的浏览器中使用hasAttribute()方法,在IE中需要使用特性的specified属性。
        *2.表单中如果包括<fieldset>
        *元素,则该元素会出现在表单集合中但是没有type属性。因此,如果type属性未定义,则不必对其进行序列化;同样,对于
        *各种按钮以及文件输入字段都是如此。
        *3.对于单选按钮和复选框,要检查其checked属性是否被设置为false,如果是则退出switch语句,如果checked属性为true
        *则继续进行default内容,即将当前的名称和值进行编码,然后添加到parts数组中。函数的最后一步就是使用join格式化整
        *个字符串,也就是用和好来分隔每一个表单字段
        */
        switch(field.type){
            case"select-one":
            case"select-multiple":
                            if(field.name.length){
                                for(var j=0,opLen=filed.options.length;j<opLen;j++){
                                    option=field.options[j];
                                    if(option.selected){
                                        opValue=‘‘;
                                        if(option.hasAttribute){
                                            opValue=(option.hasAttribute(‘value‘)?option.value:option.text);
                                        }else{
                                            opValue=(option.hasAttribute[‘value‘].specified?option.value:option.text);//IE下
                                        }
                                        parts.push(encodeURIComponent(‘"‘+ field.name + ‘":"‘) + encodeURIComponent(opValue)) + ‘"‘;
                                    }

                                }
                            }
                            break;
            case undefined:
            case "file":
            case "submit":
            case "reset":
            case "button":
                break;
            case "text":
            case "number":
            case "date":
            case "textarea":
                if(field.name.length){
                    normalValue = field.value;
                    parts.push(‘"‘ + field.name + ‘":"‘ + normalValue.trim() + ‘"‘);
                }
                break;
            case "radio":
            case "checkbox":
                if(!field.checked){
                    break;
                }
            default:
                if(field.name.length){
                    parts.push(‘"‘ + field.name + ‘":"‘ + normalValue+ ‘"‘);
                }
                break;
        }
    }
    return ‘{‘ + parts.join(‘,‘) + ‘}‘;
}

四、注意

  json字符串实例化为json对象时,对json字符串的格式有严格规定,属性名和属性值必须用双引号引起,否则在调用JSON转化时,将报错,且实例化失败。

时间: 2024-10-10 23:24:53

JavaScript之form表单的序列化和json化[form.js]的相关文章

form表单嵌套,用标签的form属性来解决表单嵌套的问题

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>标签的form属性</title> </head> <body> <form action="demo-form.php" id="form1"> First name: <input type="text

[oldboy-django][2深入django]form表单clean_xx, clean完成数据验证+ form错误信息

form后台生成form里面的Input标签,以及设置Input的属性 # 需求 后台生成form里面的input标签,并设置input标签的属性, class RegisterForm(Form): email = fields.EmailField() password = fields.CharField() password2 = fields.CharField() code = fields.CharField() avatar = fields.FileField(widget=w

Javascript中的Form表单知识点总结

在HTML中,表单是由form元素来表示的,但是在javascript中,表单则由HTMLFormElement类型,此元素继承了HTMLElement,因此与其他HTML元素具有相同的默认属性:HTMLFormElement有自己以下属性和方法: acceptCharset: 服务器能够处理的字符集:等价于HTML中的accept-charset特性: action:  接收请求的URL,等价于HTML中的action elements: 表单中所有控件的集合. enctype: 请求的编码类

form表单submit提交内容,跟ajax异步提交form表单的区别,

因为开发一个小细节,本来是上传文件,填写文件名进行ajax提交,但是没有获取到文件的绝对地址, 所以使用了form表单提交文件,然后又觉得form表单+ajax提交联系起来比较好,不用改动太多代码. 区别: Form表单提交:一般都会进行页面跳转: Ajax异步提交:可以不进行页面跳转: Form表单提交 <body> <div id="forms”> <form id="form1" action="/users/login"

javascprit form表单提交前验证以及ajax返回json

1.今天要做一个手机验证码验证的功能.需求是前端页面点击发送 短信验证码,后台接收后通过ajax返回到前端,之后前端在提交时候进行验证.思路很简单,不过做的过程还是学到不少的东西. 1.ajax请求后返回 returning 405 Method Not Allowed 原因是我后台返回的时候没有加上: @ResponseBody注解.加上后返回的数据是json字符串,但是js只能操作json对象.需要把json字符串转为json对象.一般的有三种方式1.JSON.parse();如 var j

Django框架 之 Form表单和Ajax上传文件

浏览目录 Form表单上传文件 Ajax上传文件 伪造Ajax上传文件 Form表单上传文件 html <h3>form表单上传文件</h3> <form action="/upload_file/" method="post" enctype="multipart/form-data"> <p><input type="file" name="upload_fi

fsLayuiPlugin数据表格弹出form表单说明

fsLayuiPlugin 是一个基于layui的快速开发插件,支持数据表格增删改查操作,提供通用的组件,通过配置html实现数据请求,减少前端js重复开发的工作. GitHub下载 码云下载 测试环境地址:http://fslayui.itcto.cn css和js引用 公共css和js必须全部引用 <!-- layui css --> <link rel="stylesheet" type="text/css" href="/plug

form表单提交的两种方式 button和submit的使用方法

1.当输入用户名和密码为空的时候,需要判断.这时候就用到了校验用户名和密码,这个需要在jsp的前端页面写:有两种方法,一种是用submit提交.一种是用button提交.方法一: 在jsp的前端页面的头部插入一个js方法: function checkUser(){   var result = document.getElementById("userid").value;   var password = document.getElementById("userpass

form表单提交的两种方式

1.当输入用户名和密码为空的时候,需要判断.这时候就用到了校验用户名和密码,这个需要在jsp的前端页面写:有两种方法,一种是用submit提交.一种是用button提交.方法一: 在jsp的前端页面的头部插入一个js方法: function checkUser(){   var result = document.getElementById("userid").value;   var password = document.getElementById("userpass