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 document.execCommand() 常用解析
Dec 14 Javascript
Jquery Validation插件防止重复提交表单的解决方法
Mar 05 Javascript
jQuery中val()方法用法实例
Dec 25 Javascript
AngularJS表单编辑提交功能实例
Feb 13 Javascript
深入解析JavaScript编程中的this关键字使用
Nov 09 Javascript
javascript中获取class的简单实现
Jul 12 Javascript
详解webpack3如何正确引用并使用jQuery库
Aug 26 jQuery
javascript实现抢购倒计时程序
Aug 26 Javascript
微信小程序 点击切换样式scroll-view实现代码实例
Oct 11 Javascript
js实现左右轮播图
Jan 09 Javascript
浅谈Vue.use到底是什么鬼
Jan 21 Javascript
vue路由实现登录拦截
Mar 24 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
自己开发Dojo的建议框架
2008/09/24 Javascript
return false,对阻止事件默认动作的一些测试代码
2010/11/17 Javascript
基于HTML模板和JSON数据的JavaScript交互(移动端)
2016/04/06 Javascript
基于JQuery的$.ajax方法进行异步请求导致页面闪烁的解决办法
2016/05/10 Javascript
webpack vue项目开发环境局域网访问方法
2018/03/20 Javascript
vue树形结构获取键值的方法示例
2018/06/21 Javascript
Bootstrap table表格初始化表格数据的方法
2018/07/25 Javascript
微信小程序实现搜索历史功能
2020/03/26 Javascript
在JavaScript中使用严格模式(Strict Mode)
2019/06/13 Javascript
VUE兄弟组件传值操作实例分析
2019/10/26 Javascript
json解析大全 双引号、键值对不在一起的情况
2019/12/06 Javascript
JavaScript实现手风琴效果
2021/02/18 Javascript
JavaScript 实现继承的几种方式
2021/02/19 Javascript
[03:55]DOTA2完美大师赛选手传记——LFY.MONET
2017/11/18 DOTA
python列表操作实例
2015/01/14 Python
python使用pil生成缩略图的方法
2015/03/26 Python
Python实现在线音乐播放器
2017/03/03 Python
浅析使用Python操作文件
2017/07/31 Python
opencv python 基于KNN的手写体识别的实例
2018/08/03 Python
Django forms组件的使用教程
2018/10/08 Python
pycharm 取消默认的右击运行unittest的方法
2018/11/29 Python
Django--权限Permissions的例子
2019/08/28 Python
详解Python 重学requests发起请求的基本方式
2020/02/07 Python
Jupyter notebook无法导入第三方模块的解决方式
2020/04/15 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
2020/06/08 Python
Django启动时找不到mysqlclient问题解决方案
2020/11/11 Python
详解python3 GUI刷屏器(附源码)
2021/02/18 Python
html5 postMessage解决跨域、跨窗口消息传递方案
2016/12/20 HTML / CSS
GNC健安喜美国官网:美国第一营养品牌
2016/07/22 全球购物
加拿大女包品牌:Matt & Nat
2017/05/12 全球购物
大学生求职自我评价
2014/01/16 职场文书
优秀乡村医生事迹材料
2014/05/28 职场文书
2014年食品安全工作总结
2014/12/04 职场文书
工人先锋号事迹材料
2014/12/24 职场文书
深度学习详解之初试机器学习
2021/04/14 Python
python plt.plot bar 如何设置绘图尺寸大小
2021/06/01 Python