利用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 相关文章推荐
利用js对象弹出一个层
Mar 26 Javascript
JavaScript中数据结构与算法(二):队列
Jun 19 Javascript
js阻止浏览器默认行为的简单实例
May 15 Javascript
JavaScript蒙板(model)功能的简单实现代码
Aug 04 Javascript
纯JavaScript 实现flappy bird小游戏实例代码
Sep 27 Javascript
简单实现Bootstrap标签页
Aug 09 Javascript
JavaScript实现自定义媒体播放器方法介绍
Jan 03 Javascript
Bootstrap表格制作代码
Mar 17 Javascript
解决angular2 获取到的数据无法实时更新的问题
Aug 31 Javascript
electron-vue利用webpack打包实现多页面的入口文件问题
May 12 Javascript
js瀑布流布局的实现
Jun 28 Javascript
用几道面试题来看JavaScript执行机制
Apr 30 Javascript
手机移动端实现 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
漫威DC即将合作联动,而双方早已经秘密开始
2020/04/09 欧美动漫
php相对当前文件include其它文件的方法
2015/03/13 PHP
从数组中随机取x条不重复数据的JS代码
2013/12/24 Javascript
jQuery设置与获取HTML,文本和值的简单实例
2014/02/26 Javascript
Javascript实现的SHA-256加密算法完整实例
2016/02/02 Javascript
js判断空对象的实例(超简单)
2016/07/26 Javascript
JS重载实现方法分析
2016/12/16 Javascript
Jqprint实现页面打印
2017/01/06 Javascript
javascript html5轻松实现拖动功能
2017/03/01 Javascript
AngularJS 异步解决实现方法
2017/06/12 Javascript
vue实现登陆登出的实现示例
2017/09/15 Javascript
原生JS上传大文件显示进度条 php上传文件代码
2020/03/27 Javascript
js如何找出字符串中的最长回文串
2018/06/04 Javascript
webpack手动配置React开发环境的步骤
2018/07/02 Javascript
Vue 实现拖动滑块验证功能(只有css+js没有后台验证步骤)
2018/08/24 Javascript
cnpm加速Angular项目创建的方法
2018/09/07 Javascript
vue使用canvas实现移动端手写签名
2020/09/22 Javascript
vue实现井字棋游戏
2020/09/29 Javascript
基于element-ui封装表单金额输入框的方法示例
2021/01/06 Javascript
Python网络爬虫实例讲解
2016/04/28 Python
Django rest framework jwt的使用方法详解
2019/08/08 Python
python字典key不能是可以是啥类型
2020/08/04 Python
html5中监听canvas内部元素点击事件的三种方法
2019/04/28 HTML / CSS
canvas小画板之平滑曲线的实现
2020/08/12 HTML / CSS
伦敦一家西班牙童装精品店:La Coqueta
2018/02/02 全球购物
阿联酋航空假期:Emirates Holidays
2018/03/20 全球购物
行政主管职责范本
2014/03/07 职场文书
目标责任书范本
2014/04/16 职场文书
入党积极分子评语
2014/05/04 职场文书
教师个人工作总结范文2014
2014/11/10 职场文书
二年级语文下册复习计划
2015/01/19 职场文书
收费员岗位职责
2015/02/14 职场文书
2015毕业生简历自我评价
2015/03/02 职场文书
昆虫记读书笔记
2015/06/26 职场文书
2016暑期社会实践新闻稿
2015/11/25 职场文书
2019送给家人们的中秋节祝福语
2019/08/15 职场文书