JS多个表单数据提交下的serialize()应用实例分析


Posted in Javascript onAugust 27, 2019

本文实例讲述了JS多个表单数据提交下的serialize()应用。分享给大家供大家参考,具体如下:

在实际开发场景中,难免遇到需要多个表单的数据传递问题。

之所以要进行多表单的数据传递是因为可以进行数据分组,便于数据的维护。

这个时候,出于不依赖jquery的考虑,有一个原生js函数来解决这个问题无疑是最好的。而源自于《JavaScript高级程序设计》一书的serialize()函数就是解决这个问题的最好办法,该函数如下:

function serialize(form){
      var parts = [],
        field = null,
        i,
        len,
        j,
        optLen,
        option,
        optValue;
      for (i=0, len=form.elements.length; i < len; i++){
        field = form.elements[i];
        switch(field.type){
          case "select-one":
          case "select-multiple":
            if (field.name.length){
              for (j=0, optLen = field.options.length; j < optLen; j++){
                option = field.options[j];
                if (option.selected){
                  optValue = "";
                  if (option.hasAttribute){
                    optValue = (option.hasAttribute("value") ? option.value : option.text);
                  } else {
                    optValue = (option.attributes["value"].specified ? option.value : option.text);
                  }
                  parts.push(encodeURIComponent(field.name) + "=" + encodeURIComponent(optValue));
                }
              }
            }
            break;
          case undefined:   //fieldset
          case "file":    //file input
          case "submit":   //submit button
          case "reset":    //reset button
          case "button":   //custom button
            break;
          case "radio":    //radio button
          case "checkbox":  //checkbox
            if (!field.checked){
              break;
            }
            /* falls through */
          default:
            //don't include form fields without names
            if (field.name.length){
              parts.push(encodeURIComponent(field.name) + "=" + encodeURIComponent(field.value));
            }
        }
      }
      console.log(parts);
      return parts.join("&");
}

对于读过《JavaScript高级程序设计》的小伙伴来说,这个函数肯定不陌生;

但是如果我们传递的是一个对象,那么这个函数显然就不符合要求,而在这个开发需求下,我们改下这个函数,改造后函数如下

function serialize(form){
      var parts = {},
        field = null,
        i,
        len,
        j,
        optLen,
        option,
        optValue;
      for (i=0, len=form.elements.length; i < len; i++){
        field = form.elements[i];
        switch(field.type){
          case "select-one":
          case "select-multiple":
            if (field.name.length){
              for (j=0, optLen = field.options.length; j < optLen; j++){
                option = field.options[j];
                if (option.selected){
                  optValue = "";
                  if (option.hasAttribute){
                    optValue = (option.hasAttribute("value") ? option.value : option.text);
                  } else {
                    optValue = (option.attributes["value"].specified ? option.value : option.text);
                  }
                  //将数据改为对象形式
                  Object.defineProperty(parts, encodeURIComponent(field.name), {
                    value:encodeURIComponent(optValue),
                    enumerable:true //为真表示可枚举,只有可枚举才能出现在JSON.stringify()转换的json数据中
                  });
                }
              }
            }
            break;
          case undefined:   //fieldset
          case "file":    //file input
          case "submit":   //submit button
          case "reset":    //reset button
          case "button":   //custom button
            break;
          case "radio":    //radio button
          case "checkbox":  //checkbox
            if (!field.checked){
              break;
            }
            /* falls through */
          default:
            //don't include form fields without names
            if (field.name.length){
              //构建对象
              Object.defineProperty(parts, encodeURIComponent(field.name), {
                    value:encodeURIComponent(field.value),
                    enumerable:true  //为真表示可枚举,只有可枚举才能出现在JSON.stringify()转换的json数据中
                  });
            }
        }
      }
      console.log(parts);
      return parts;
}

于是,表单数据改为对象显示。如果有多个表单将表单保存到一个数组之中,利用JSON.stringify()转为json格式,传给后端;

注意:

利用Object.defineProperty创建对象,要加上 enumerable:true,否则json格式中不会出现对应的对象数据。这个纯粹是JSON.stringify()的要求。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

更多关于JavaScript相关内容可查看本站专题:《JavaScript操作DOM技巧总结》、《JavaScript页面元素操作技巧总结》、《JavaScript事件相关操作与技巧大全》、《JavaScript查找算法技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript错误与调试技巧总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript suggest效果 自动完成实现代码分享
Feb 17 Javascript
如何使用jQuery Draggable和Droppable实现拖拽功能
Jul 05 Javascript
跨域传值即主页面与iframe之间互相传值
Dec 09 Javascript
JS制作手机端自适应缩放显示
Jun 11 Javascript
jquery对Json的各种遍历方法总结(必看篇)
Sep 29 Javascript
浅谈JS中String()与 .toString()的区别
Oct 20 Javascript
Bootstrap table使用方法详细介绍
Dec 09 Javascript
详解Javascript数据类型的转换规则
Dec 12 Javascript
Bootstrap 表单验证formValidation 实现表单动态验证功能
May 17 Javascript
微信小程序中使用wxss加载图片并实现动画效果
Aug 13 Javascript
vue中render函数的使用详解
Oct 12 Javascript
JS判断浏览器类型与操作系统的方法分析
Apr 30 Javascript
解决Vue中 父子传值 数据丢失问题
Aug 27 #Javascript
原生javascript自定义input[type=radio]效果示例
Aug 27 #Javascript
基于JS抓取某高校附近共享单车位置 使用web方式展示位置变化代码实例
Aug 27 #Javascript
使用Vue.js中的过滤器实现幂方求值的方法
Aug 27 #Javascript
Vue+ElementUI项目使用webpack输出MPA的方法
Aug 27 #Javascript
解决jquery validate 验证不通过后验证正确的信息仍残留在label上的方法
Aug 27 #jQuery
Net微信网页开发 使用微信JS-SDK获取当前地理位置过程详解
Aug 26 #Javascript
You might like
Zend的MVC机制使用分析(二)
2013/05/02 PHP
PHP把网页保存为word文件的三种方法
2014/04/01 PHP
PHP遍历目录文件的常用方法小结
2017/02/03 PHP
兼容IE/Firefox/Opera/Safari的检测页面装载完毕的脚本Ext.onReady的实现
2009/07/14 Javascript
jquery 插件开发备注
2010/08/27 Javascript
更换select下拉菜单背景样式的实现代码
2011/12/20 Javascript
Extjs4 类的定义和扩展实例
2013/06/28 Javascript
JavaScript运行时库属性一览表
2014/03/14 Javascript
28个常用JavaScript方法集锦
2015/01/14 Javascript
jquery实现网页的页面平滑滚动效果代码
2015/11/02 Javascript
Node.js 应用跑得更快 10 个技巧
2016/04/03 Javascript
BootStrap中的表单大全
2016/09/07 Javascript
javascript遍历json对象的key和任意js对象属性实例
2017/03/09 Javascript
JS+WCF实现进度条实时监测数据加载量的方法详解
2017/12/19 Javascript
vue+vuex+axios实现登录、注册页权限拦截
2018/03/09 Javascript
swiper在angularjs中使用循环轮播失效的解决方法
2018/09/27 Javascript
Vue表单绑定的实例代码(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)
2019/05/13 Javascript
[01:07:17]EG vs Optic Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
[01:16:16]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第二场 1月8日
2021/03/11 DOTA
Python实现读取目录所有文件的文件名并保存到txt文件代码
2014/11/22 Python
Python标准库urllib2的一些使用细节总结
2015/03/16 Python
使用Python的Bottle框架写一个简单的服务接口的示例
2015/08/25 Python
Python3.5面向对象编程图文与实例详解
2019/04/24 Python
Python实现EXCEL表格的排序功能示例
2019/06/25 Python
python PyQt5/Pyside2 按钮右击菜单实例代码
2019/08/17 Python
Django模型中字段属性choice使用说明
2020/03/30 Python
python批量处理多DNS多域名的nslookup解析实现
2020/06/28 Python
改变生活的男士内衣:SAXX Underwear
2019/08/28 全球购物
酒店总经理欢迎词
2014/01/15 职场文书
策划创业计划书
2014/02/06 职场文书
副科级后备干部考察材料
2014/05/15 职场文书
幼儿园师德师风学习材料
2014/05/29 职场文书
保卫工作个人总结
2015/03/03 职场文书
简历中的自我评价怎么写呢?
2019/04/30 职场文书
Python OpenCV实现传统图片格式与base64转换
2021/06/13 Python
Golang MatrixOne使用介绍和汇编语法
2022/04/19 Golang