利用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给input和textarea设定ie中的focus
May 29 Javascript
jquery validator 插件增加日期比较方法
Feb 21 Javascript
SyntaxHighlighter语法高亮插件使用说明
Aug 14 Javascript
JavaScript中的面向对象介绍
Jun 30 Javascript
Javascript Memoizer浅析
Oct 16 Javascript
JavaScript AOP编程实例
Jun 16 Javascript
jQuery Ajax 加载数据时异步显示加载动画
Aug 01 Javascript
AngularJS基础 ng-keydown 指令简单示例
Aug 02 Javascript
Angular动态添加、删除输入框并计算值实例代码
Mar 29 Javascript
JavaScript实现简单的四则运算计算器完整实例
Apr 28 Javascript
深入理解vue Render函数
Jul 19 Javascript
jquery tmpl模板(实例讲解)
Sep 02 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实现浏览器点击下载TXT文档的方法详解
2013/06/02 PHP
php启用sphinx全文搜索的实现方法
2014/12/24 PHP
PHP构造二叉树算法示例
2017/06/21 PHP
popdiv
2006/07/14 Javascript
JavaScript ECMA-262-3 深入解析.第三章.this
2011/09/28 Javascript
location对象的属性和方法应用(解析URL)
2013/04/12 Javascript
js中replace的用法总结
2013/12/27 Javascript
js从外部获取图片的实现方法
2016/08/05 Javascript
AngularJS国际化详解及示例代码
2016/08/18 Javascript
Angular页面间切换及传值的4种方法
2016/11/04 Javascript
js数组与字符串常用方法总结
2017/01/13 Javascript
jQuery实现大图轮播
2017/02/13 Javascript
JS自动生成动态HTML验证码页面
2017/06/14 Javascript
React + webpack 环境配置的方法步骤
2017/09/07 Javascript
关于预加载InstantClick的问题解决方法
2017/09/12 Javascript
jQuery动态移除与增加onclick属性的方法详解
2018/06/07 jQuery
微信小程序解析富文本过程详解
2019/07/13 Javascript
JavaScript创建表格的方法
2020/04/13 Javascript
在RedHat系Linux上部署Python的Celery框架的教程
2015/04/07 Python
django输出html内容的实例
2018/05/27 Python
python之django母板页面的使用
2018/07/03 Python
python numpy数组的索引和切片的操作方法
2018/10/20 Python
python tkinter实现界面切换的示例代码
2019/06/14 Python
python的mysql数据库建立表与插入数据操作示例
2019/09/30 Python
python 使用事件对象asyncio.Event来同步协程的操作
2020/05/04 Python
用Python开发app后端有优势吗
2020/06/29 Python
Topshop美国官网:英国快速时尚品牌
2019/05/16 全球购物
航空大学应届生求职信
2013/11/10 职场文书
采购部主管岗位职责
2014/01/01 职场文书
导师工作推荐信范文
2014/05/17 职场文书
中标通知书范本
2015/04/17 职场文书
三严三实·严以用权心得体会
2016/01/12 职场文书
python 提取html文本的方法
2021/05/20 Python
Python开发之QT解决无边框界面拖动卡屏问题(附带源码)
2021/05/27 Python
DIV CSS实现网页背景半透明效果
2021/12/06 HTML / CSS
Mysql分析设计表主键为何不用uuid
2022/03/31 MySQL