利用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 相关文章推荐
jQuery对象和DOM对象使用说明
Jun 25 Javascript
js网页版计算器的简单实现
Jul 02 Javascript
jQuery+css3实现文字跟随鼠标的上下抖动
Jul 31 Javascript
JS实现网页游戏中滑块响应鼠标点击移动效果
Oct 19 Javascript
Jquery日历插件制作简单日历
Oct 28 Javascript
AngularJS入门之动画
Jul 27 Javascript
AngularJS基础 ng-mouseleave 指令详解
Aug 02 Javascript
微信小程序 解决请求服务器手机预览请求不到数据的方法
Jan 04 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
Mar 14 Javascript
js自定义瀑布流布局插件
May 16 Javascript
Vue实现多标签选择器
Nov 28 Javascript
JS实现悬浮球只在一侧滑动并且是横屏状态下
Aug 19 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
一篇不错的PHP基础学习笔记
2007/03/18 PHP
dede全站URL静态化改造[070414更正]
2007/04/17 PHP
php curl基本操作详解
2013/07/23 PHP
php使用GeoIP库实例
2014/06/27 PHP
MySql数据库查询结果用表格输出PHP代码示例
2015/03/20 PHP
php遍历CSV类实例
2015/04/14 PHP
PHP常用函数总结(180多个)
2016/12/25 PHP
PHP 中魔术常量的实例详解
2017/10/26 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
JavaScript.Encode手动解码技巧
2010/07/14 Javascript
jQuery.fn和jQuery.prototype区别介绍
2013/10/05 Javascript
图文详解JavaScript的原型对象及原型链
2016/08/02 Javascript
第一次接触Bootstrap框架
2016/10/24 Javascript
AngularJS中的JSONP实例解析
2016/12/01 Javascript
Bootstrap源码解读下拉菜单(4)
2016/12/23 Javascript
微信小程序云函数使用mysql数据库过程详解
2019/08/07 Javascript
使用pkg打包ThinkJS项目的方法步骤
2019/12/30 Javascript
讲解Python的Scrapy爬虫框架使用代理进行采集的方法
2016/02/18 Python
Java实现的执行python脚本工具类示例【使用jython.jar】
2018/03/29 Python
使用Django开发简单接口实现文章增删改查
2019/05/09 Python
python django 原生sql 获取数据的例子
2019/08/14 Python
CSS3中Animation属性的使用详解
2015/08/06 HTML / CSS
大学生求职简历的自我评价范文
2013/10/12 职场文书
市场开发与营销专业求职信
2013/12/31 职场文书
领导证婚人证婚词
2014/01/13 职场文书
淘宝店铺营销方案
2014/02/13 职场文书
《赠汪伦》教学反思
2014/04/12 职场文书
合伙经营协议书范本
2014/04/18 职场文书
微电影大赛策划方案
2014/06/05 职场文书
教师党员个人自我剖析材料
2014/09/29 职场文书
毕业生见习报告总结
2014/11/08 职场文书
网络营销计划
2015/01/17 职场文书
幼师个人总结范文
2015/02/28 职场文书
2015年维修电工工作总结
2015/04/25 职场文书
关于环保的广播稿
2015/12/17 职场文书
Mysql 一主多从的部署
2022/05/20 MySQL