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实现计算两个日期的间隔天数
Aug 14 Javascript
js列举css中所有图标的实现代码
Jul 04 Javascript
jQuery选择器的工作原理和优化分析
Jul 25 Javascript
通过AJAX的JS、JQuery两种方式解析XML示例介绍
Sep 23 Javascript
第二章之Bootstrap 页面排版样式
Apr 25 Javascript
百度多文件异步上传控件webuploader基本用法解析
Nov 07 Javascript
jQuery Masonry瀑布流插件使用方法详解
Jan 18 Javascript
vue组件中使用iframe元素的示例代码
Dec 13 Javascript
ionic grid(栅格)九宫格制作详解
Jun 30 Javascript
echarts设置图例颜色和地图底色的方法实例
Aug 01 Javascript
解决vue-cli@3.xx安装不成功的问题及搭建ts-vue项目
Feb 09 Javascript
TS 类型兼容教程示例详解
Sep 23 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
解析Linux下Varnish缓存的配置优化
2013/06/20 PHP
PHP实现视频文件上传完整实例
2014/08/28 PHP
php强制运行广告的方法
2014/12/01 PHP
js代码实现微博导航栏
2015/07/30 PHP
javascript实现表格排序 编辑 拖拽 缩放
2015/01/02 Javascript
js实现动画特效的文字链接鼠标悬停提示的方法
2015/03/02 Javascript
JavaScript中property和attribute的区别详细介绍
2015/03/03 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
2015/05/01 Javascript
angular.bind使用心得
2015/10/26 Javascript
jQuery实现对无序列表的排序功能(附demo源码下载)
2016/06/25 Javascript
JavaScript中Number对象的toFixed() 方法详解
2016/09/02 Javascript
清除浏览器缓存的几种方法总结(必看)
2016/12/09 Javascript
jQuery源码分析之init的详细介绍
2017/02/13 Javascript
JS实现websocket长轮询实时消息提示的效果
2017/10/10 Javascript
JavaScript 作用域实例分析
2019/10/02 Javascript
Vue中keep-alive的两种应用方式
2020/07/15 Javascript
[06:42]DOTA2每周TOP10 精彩击杀集锦vol.1
2014/06/25 DOTA
python解析xml文件操作实例
2014/10/05 Python
Flask框架各种常见装饰器示例
2018/07/17 Python
Python中实现单例模式的n种方式和原理
2018/11/14 Python
Python通用循环的构造方法实例分析
2018/12/19 Python
Django使用Celery加redis执行异步任务的实例内容
2020/02/20 Python
5行Python代码实现图像分割的步骤详解
2020/05/25 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
2020/05/26 Python
html5小技巧之通过document.head获取head元素
2014/06/04 HTML / CSS
英国婴儿和儿童服装网站:Vertbaudet
2018/04/02 全球购物
strstr()的简单实现
2013/09/26 面试题
英语系毕业生自荐信
2013/10/31 职场文书
酒吧副总经理岗位职责
2013/12/10 职场文书
义务教育学校标准化建设汇报材料
2014/08/16 职场文书
教师职业道德事迹材料
2014/08/18 职场文书
活动总结范文
2014/08/30 职场文书
个人查摆问题自查报告
2014/10/16 职场文书
质检员岗位职责范本
2015/04/07 职场文书
Django给表单添加honeypot验证增加安全性
2021/05/06 Python
电脑只能进入安全模式无法正常启动的解决办法
2022/04/08 数码科技