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 相关文章推荐
jquery下jstree简单应用 - v1.0
Apr 14 Javascript
javascript获取本机操作系统类型的方法
Aug 13 Javascript
JS实现状态栏跑马灯文字效果代码
Oct 24 Javascript
详解JavaScript的AngularJS框架中的作用域与数据绑定
Mar 04 Javascript
BootStrap glyphicons 字体图标实现方法
May 01 Javascript
JavaScript代码性能优化总结篇
May 15 Javascript
jQuery插件FusionCharts绘制的2D双柱状图效果示例【附demo源码】
May 13 jQuery
jQuery实现弹窗下底部页面禁止滑动效果
Dec 19 jQuery
Vue 源码分析之 Observer实现过程
Mar 29 Javascript
element中el-container容器与div布局区分详解
May 13 Javascript
微信小程序实现通讯录列表展开收起
Nov 18 Javascript
三种方式清除vue路由跳转router-link的历史记录
Apr 10 Vue.js
解决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
超外差式晶体管收音机的组装与统调
2021/03/01 无线电
php中注册器模式类用法实例分析
2015/11/03 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
PHP接入支付宝接口失效流程详解
2020/11/10 PHP
js玩一玩WSH吧
2007/02/23 Javascript
使用jquery实现div的tab切换实例代码
2013/05/27 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
2014/05/04 Javascript
jQuery中prevAll()方法用法实例
2015/01/08 Javascript
jQuery左侧大图右侧小图焦点图幻灯切换代码分享
2015/08/19 Javascript
jQuery双向列表选择器DIV模拟版
2016/11/01 Javascript
vue兄弟组件传递数据的实例
2018/09/06 Javascript
vue实现条件判断动态绑定样式的方法
2018/09/29 Javascript
Element-UI中Upload上传文件前端缓存处理示例
2019/02/21 Javascript
jQuery实现文本显示一段时间后隐藏的方法分析
2019/06/20 jQuery
[01:07:02]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第三场 2月26日
2021/03/11 DOTA
跟老齐学Python之玩转字符串(1)
2014/09/14 Python
Python实现感知器模型、两层神经网络
2017/12/19 Python
Python基于jieba库进行简单分词及词云功能实现方法
2018/06/16 Python
python多个模块py文件的数据共享实例
2019/01/11 Python
Python操作配置文件ini的三种方法讲解
2019/02/22 Python
Python 给定的经纬度标注在地图上的实现方法
2019/07/05 Python
python科学计算之numpy——ufunc函数用法
2019/11/25 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
2019/12/09 Python
Python用类实现扑克牌发牌的示例代码
2020/06/01 Python
Python学习之路安装pycharm的教程详解
2020/06/17 Python
Python魔术方法专题
2020/06/19 Python
Python 利用flask搭建一个共享服务器的步骤
2020/12/05 Python
css3中检验表单的required,focus,valid和invalid样式
2014/02/21 HTML / CSS
使用HTML和CSS实现的标签云效果(附demo)
2021/02/03 HTML / CSS
英国第一豪华护肤品牌:Elemis
2017/10/12 全球购物
英国床垫和床架购物网站:Bedman
2019/11/04 全球购物
若干个Java基础面试题
2015/05/19 面试题
2014年电话客服工作总结
2014/12/09 职场文书
股东大会通知
2015/04/24 职场文书
金正昆讲礼仪观后感
2015/06/11 职场文书
python使用matplotlib绘制图片时x轴的刻度处理
2021/08/30 Python