利用JS轻松实现获取表单数据


Posted in Javascript onDecember 06, 2016

接触过Angularjs的都知道,ng支持双向绑定,我们可以轻轻松松的通过ngModel将我们的值绑定到界面,当修改了值提交表单的时候不需要再重新通过ID去重新抓取输入框信息了。那对于我们开发前台网站,不用ng一类的MVVM框架,只引用了Jquery,那么在处理表单的时候该怎么做呢。

一. 原始做法

<div id="form">
  <select id='select1'>
   <option value="">--请选择--</option>
   <option value="1">--1--</option>
   <option value="2">--2--</option>
   <option value="3">--3--</option>
  </select>
  <input id='radio1' type="radio" />
  <input id='text1' type="text" />
  <textarea id='textArea1' ></textarea>
</div>

程序员A会说,So easy,通过Jquery id 去获取每个输入框的值就OK。多简单。

function getEntity(){
  return {
    select1:$("#select1").val(),
    radio1:$("#radio1").prop('checked'),
    text1:$("text1").val(),
    textArea1:$("textArea1").val()
  }
}

二. 升级做法.

 程序员B说, 这样不行哦,很多页面都有表单提交, 那不是每个地方都要用Jquery去获取值,如果以后新增了输入框,每次HTML修改了,还要修改对应的JS,多麻烦。于是爱偷懒的程序员B想到了一种方法,通过自定义标签来实现。

 2.1  我们将表单包装到一个form的div下,每个输入的控件新增一个data-field属性. data-field里面写构建实体的属性名称,考虑到会出现嵌套的对象。所以data-field 里面属性名称通过 . 点来隔开,譬如  data-field='Person.Name' 后面就会构建出 { Person:{ Name:xxx }} .下面的是没有嵌套的对象的例子

<div id="form">
    <select data-field='select1'>
     <option value="">--请选择--</option>
     <option value="1">--1--</option>
     <option value="2">--2--</option>
     <option value="3">--3--</option>
    </select>
    <input data-field='radio1' type="radio" />
    <input data-field='text1' type="text" />
    <textarea data-field='textArea1'></textarea>
 </div>

2.2 提供一个getEntity方法。 读取外层的Form然后找到所有的data-field 属性去遍历. 因为输入框有checkbox和radio,input和select, 所以判断类型先取出值。然后调用getField方法构建实体。代码就不做详细解答了。应该都能看懂。只是想表达一下思路想法而已。

function getEntity(form) {
   var result = {};
   $(form).find("[data-field]").each(function() {
     var field = $(this).attr("data-field");
     var val;
 
     if ($(this).attr('type') == 'checkbox') {
       val = $(this).prop('checked');
     } else if ($(this).attr('type') == 'radio') {
       val = $(this).prop('checked');
     } else {
       val = $(this).val();
     }
     // 获取单个属性的值,并扩展到result对象里面
     getField(field.split('.'), val, result);
   });
   return result;
 }

function getField(fieldNames, value, result) {
  if (fieldNames.length > 1) {
    for (var i = 0; i < fieldNames.length - 1; i++) {
      if (result[fieldNames[i]] == undefined) {
        result[fieldNames[i]] = {}
      }
      result = result[fieldNames[i]];
    }
    result[fieldNames[fieldNames.length - 1]] = value;
  } else {
    result[fieldNames[0]] = value;
  }
}

2.3 下面来看看上面输出的结果,哈哈值取到了。

利用JS轻松实现获取表单数据

2.4 下面我们来看看看嵌套的对象

<div id="form">
    <select data-field='Person.Job'>
     <option value="">--职位--</option>
     <option value="java工程师">java工程师</option>
     <option value="net工程师">.net工程师</option>
     <option value="python工程师">python工程师</option>
    </select>
    <input data-field='Person.Desc' type="text" />
  </div>

利用JS轻松实现获取表单数据

2.5  提供了获取实体的方法,当然也要提供赋值的方法呀。下面来看看赋值的方法

function setEntity(form, entity) {
  $(form).find("[data-field]").each(function() {
    var field = $(this).attr("data-field");
    fieldNames = field.split('.');
    var value = JSON.parse(JSON.stringify(entity));
    for (var index = 0; index < fieldNames.length; index++) {
      value = value[fieldNames[index]];
      if (!value) {
        break;
      }
    }
    if ($(this).attr("type") === "checkbox" ||
      $(this).attr("type") === "radio") {
      $(this).attr('checked', Boolean(value));
    } else {
      if (value) {
        $(this).val(value);
      } else {
        $(this).val("");
      }
    }
  })
}

 利用JS轻松实现获取表单数据

呵呵,值附上去了.

     三. 总结:

    上面只是提供了解决方案, 虽然前台系统,不会考虑像后台backend 系统那样,用react,angularjs这种MVVM框架, 虽然只是用了一个Jquery而已。不过我们还是可以通过一些方法来简化项目代码的。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
用javascript实现给图片加链接
Aug 15 Javascript
[原创]来自ImageSee官方 JavaScript图片浏览器
Jan 16 Javascript
JScript 脚本实现文件下载 一般用于下载木马
Oct 29 Javascript
jquery选择器的选择使用及性能介绍
Jan 16 Javascript
Jquery中ajax方法data参数的用法小结
Feb 12 Javascript
jQuery遍历json中多个map的方法
Feb 12 Javascript
jQuery Easyui加载表格出错时在表格中间显示自定义的提示内容
Dec 08 Javascript
Node.js中.pfx后缀文件的处理方法
Mar 10 Javascript
微信小程序template模板实例详解
Oct 27 Javascript
vuex直接赋值的三种方法总结
Sep 16 Javascript
JS实现的杨辉三角【帕斯卡三角形】算法示例
Feb 26 Javascript
深入分析jQuery.one() 函数
Jun 03 jQuery
手机移动端实现 jquery和HTML5 Canvas的幸运大奖盘特效
Dec 06 #Javascript
Javascript highcharts 饼图显示数量和百分比实例代码
Dec 06 #Javascript
jQuery EasyUI 获取tabs的实例解析
Dec 06 #Javascript
如何防止INPUT按回车自动提交表单FORM
Dec 06 #Javascript
详解ECharts使用心得总结
Dec 06 #Javascript
jQuery实现删除li节点的方法
Dec 06 #Javascript
详解springmvc 接收json对象的两种方式
Dec 06 #Javascript
You might like
PHP的面试题集
2006/11/19 PHP
一个PHP的ZIP压缩类分享
2014/05/04 PHP
[原创]PHP正则删除html代码中a标签并保留标签内容的方法
2017/05/23 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
2018/02/19 PHP
JavaScript的面向对象(二)
2006/11/09 Javascript
基于Jquery的简单&amp;简陋Tabs插件代码
2010/02/09 Javascript
javascript 程序库的比较(一)之DOM功能
2010/04/07 Javascript
jquery 插件学习(二)
2012/08/06 Javascript
JsRender for object语法简介
2014/10/31 Javascript
JS+CSS实现弹出全屏灰黑色透明遮罩效果的方法
2014/12/20 Javascript
Javascript中的方法和匿名方法实例详解
2015/06/13 Javascript
jquery+正则实现统一的表单验证
2015/09/20 Javascript
jQuery实现简单的tab标签页效果
2016/09/12 Javascript
代码详解Vuejs响应式原理
2017/12/20 Javascript
详解各版本React路由的跳转的方法
2018/05/10 Javascript
node.js中TCP Socket多进程间的消息推送示例详解
2018/07/10 Javascript
详解javascript对数组和json数组的操作
2019/04/15 Javascript
react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面
2019/11/12 Javascript
可拖拽组件slider.js使用方法详解
2020/12/04 Javascript
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS OG
2018/03/30 DOTA
Python中比较特别的除法运算和幂运算介绍
2015/04/05 Python
padas 生成excel 增加sheet表的实例
2018/12/11 Python
python 实现dict转json并保存文件
2019/12/05 Python
python实现百度OCR图片识别过程解析
2020/01/17 Python
python数据爬下来保存的位置
2020/02/17 Python
django从后台返回html代码的实例
2020/03/11 Python
jupyternotebook 撤销删除的操作方式
2020/04/17 Python
Django后端分离 使用element-ui文件上传方式
2020/07/12 Python
利用python实现汉诺塔游戏
2021/03/01 Python
详解HTML5中的Communication API基本使用方法
2016/01/29 HTML / CSS
美国孕妇装品牌:Destination Maternity
2018/02/04 全球购物
Foreo国际站:Foreo International
2018/10/29 全球购物
kfc实习自我鉴定
2013/12/14 职场文书
党的群众路线教育实践活动制度建设计划方案
2014/10/31 职场文书
2014年扶贫工作总结
2014/11/18 职场文书
对讲机的最大通讯距离是多少
2022/02/18 无线电