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的返回顶部效果(兼容IE6)
Jan 17 Javascript
js实现addClass,removeClass,hasClass的函数代码
Jul 13 Javascript
JQuery入门——移除绑定事件unbind方法概述及应用
Feb 05 Javascript
使用jQuery插件创建常规模态窗口登陆效果
Aug 23 Javascript
node.js中的querystring.escape方法使用说明
Dec 10 Javascript
JavaScript实现多个重叠层点击切换效果的方法
Apr 24 Javascript
javascript中JSON对象与JSON字符串相互转换实例
Jul 11 Javascript
javascript匀速运动实现方法分析
Jan 08 Javascript
Three.js如何实现雾化效果示例代码
Sep 27 Javascript
详解Vue中localstorage和sessionstorage的使用
Dec 22 Javascript
使用jQuery如何写一个含验证码的登录界面
May 13 jQuery
vue实现跳转接口push 转场动画示例
Nov 01 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
PHP简单创建压缩图的方法
2016/08/24 PHP
利用php操作memcache缓存的基础方法示例
2017/08/02 PHP
Laravel中服务提供者和门面模式的入门介绍
2017/11/06 PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
2018/05/12 PHP
PHP接入支付宝接口失效流程详解
2020/11/10 PHP
获取网站跟路径的javascript代码(站点及虚拟目录)
2009/10/20 Javascript
jQuery 学习入门篇附实例代码
2010/03/16 Javascript
jQuery学习笔记之DOM对象和jQuery对象
2010/12/22 Javascript
chrome下img加载对height()的影响示例探讨
2014/05/26 Javascript
JavaScript运行机制之事件循环(Event Loop)详解
2014/10/10 Javascript
jQuery满屏焦点图左右滚动特效代码分享
2015/09/07 Javascript
jQuery实现背景滑动菜单
2016/12/02 Javascript
JavaScript实现定时页面跳转功能示例
2017/02/14 Javascript
bootstrap折叠调用collapse()后data-parent不生效的快速解决办法
2017/02/23 Javascript
js实现手机发送验证码功能
2017/03/13 Javascript
JavaScript实现精美个性导航栏筋斗云效果
2017/10/29 Javascript
[02:31]《DAC最前线》之选手酒店现场花絮
2015/01/30 DOTA
python网络编程学习笔记(九):数据库客户端 DB-API
2014/06/09 Python
Python脚本实现集群检测和管理功能
2015/03/06 Python
11个并不被常用但对开发非常有帮助的Python库
2015/03/31 Python
Python中实现变量赋值传递时的引用和拷贝方法
2018/04/29 Python
python中的协程深入理解
2019/06/10 Python
Python内存管理实例分析
2019/07/10 Python
python使用sessions模拟登录淘宝的方式
2019/08/16 Python
python实现的config文件读写功能示例
2019/09/24 Python
Django实现基于类的分页功能
2019/10/31 Python
ubuntu 安装pyqt5和卸载pyQt5的方法
2020/03/24 Python
Lookfantastic法国官网:英国知名美妆购物网站
2017/10/28 全球购物
英国旅行箱包和行李箱购物网站:Travel Luggage & Cabin Bags
2019/08/26 全球购物
安全生产管理责任书
2014/04/16 职场文书
贫困证明模板(3篇)
2014/09/16 职场文书
公司领导班子民主生活会对照检查材料
2014/10/02 职场文书
公司股份合作协议书
2014/12/07 职场文书
送给客户微信问候语!
2019/07/04 职场文书
springboot+VUE实现登录注册
2021/05/27 Vue.js
mysql中varchar类型的日期进行比较、排序等操作的实现
2021/11/17 MySQL