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之拖拽插件实现代码
Apr 14 Javascript
Javascript中的for in循环和hasOwnProperty结合使用
Jun 05 Javascript
jQuery中RadioButtonList的功能及用法实例介绍
Aug 23 Javascript
jQuery实现文本框输入同步的方法
Jun 20 Javascript
使用Node.js处理前端代码文件的编码问题
Feb 16 Javascript
基于jQuery实现仿微博发布框字数提示
Jul 27 Javascript
详解jQuery中基本的动画方法
Dec 14 Javascript
Vue工程模板文件 webpack打包配置方法
Dec 26 Javascript
解决vue接口数据赋值给data没有反应的问题
Aug 27 Javascript
使用layui的layer组件做弹出层的例子
Sep 27 Javascript
vue 使用插槽分发内容操作示例【单个插槽、具名插槽、作用域插槽】
Mar 06 Javascript
vue商城中商品“筛选器”功能的实现代码
Jul 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
优化使用mysql存储session的php代码
2008/01/10 PHP
Thinkphp批量更新数据的方法汇总
2016/06/29 PHP
PHP开发APP端微信支付功能
2017/02/17 PHP
php实现购物车功能(以大苹果购物网为例)
2017/03/09 PHP
laravel 5.3中自定义加密服务的方案详解
2017/05/09 PHP
列表内容的选择
2006/06/30 Javascript
JS实现商品倒计时实现代码
2013/05/03 Javascript
jQuery 删除/替换DOM元素的几种方式
2014/05/20 Javascript
在myeclipse中如何加入jquery代码提示功能
2014/06/03 Javascript
ECMAScript6新增值比较函数Object.is
2015/06/12 Javascript
JavaScript获得url查询参数的方法
2015/07/02 Javascript
解析javascript瀑布流原理实现图片滚动加载
2016/03/10 Javascript
javaScript语法总结
2016/11/25 Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
2016/12/17 Javascript
从零学习node.js之模块规范(一)
2017/02/21 Javascript
JS实现根据密码长度显示安全条功能
2017/03/08 Javascript
javascript 秒表计时器实现代码
2017/03/09 Javascript
对于input 框限定输入值为浮点型的js代码
2017/09/25 Javascript
高性能的javascript之加载顺序与执行原理篇
2018/01/14 Javascript
Vue实现一个图片懒加载插件
2019/03/11 Javascript
初学node.js中实现删除用户路由
2019/05/27 Javascript
简单了解微信小程序的目录结构
2019/07/01 Javascript
js实现html滑动图片拼图验证
2020/06/24 Javascript
微信小程序实现上传多张图片、删除图片
2020/07/29 Javascript
django中send_mail功能实现详解
2018/02/06 Python
django和vue实现数据交互的方法
2019/08/21 Python
基于python+selenium的二次封装的实现
2020/01/06 Python
协程Python 中实现多任务耗资源最小的方式
2020/10/19 Python
Django中的DateTimeField和DateField实现
2021/02/24 Python
韩国女装NO.1网店:STYLENANDA
2016/09/16 全球购物
高中军训感言200字
2014/02/23 职场文书
大跃进口号
2014/06/16 职场文书
机电系毕业生求职信
2014/07/11 职场文书
防卫过当辩护词
2015/05/21 职场文书
《好妈妈胜过好老师》:每个孩子的优秀都是有源头的
2020/01/03 职场文书
Html分层的box-shadow效果的示例代码
2021/03/30 HTML / CSS