利用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 相关文章推荐
iframe的父子窗口之间的对象相互调用基本用法
Sep 03 Javascript
JS实现点击链接取消跳转效果的方法
Jan 24 Javascript
DOM基础教程之模型中的模型节点
Jan 19 Javascript
JS实现不规则TAB选项卡效果代码
Sep 16 Javascript
Angularjs 实现分页功能及示例代码
Sep 14 Javascript
微信小程序 window_x64环境搭建
Sep 30 Javascript
vue实现可增删查改的成绩单
Oct 27 Javascript
js使用Replace结合正则替换重复出现的字符串功能示例
Dec 27 Javascript
在vue项目中引入highcharts图表的方法(详解)
Mar 05 Javascript
jQuery替换节点元素的操作方法
Mar 18 jQuery
JQuery获取元素尺寸、位置及页面滚动事件应用示例
May 14 jQuery
JavaScript实现瀑布流布局的3种方式
Dec 27 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
Thinkphp的volist标签嵌套循环使用教程
2014/07/08 PHP
PHP实现无限级分类(不使用递归)
2015/10/22 PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
2016/01/05 PHP
浅析php中array_map和array_walk的使用对比
2016/11/20 PHP
php+mysql实现简单登录注册修改密码网页
2016/11/30 PHP
php使用redis的有序集合zset实现延迟队列应用示例
2020/02/20 PHP
JavaScript验证电子邮箱的函数
2014/08/22 Javascript
JavaScript之数组(Array)详解
2015/04/01 Javascript
四种参数传递的形式——URL,超链接,js,form表单
2015/07/24 Javascript
js脚本分页代码分享(7种样式)
2015/08/19 Javascript
JavaScript定时器实现的原理分析
2016/12/06 Javascript
xmlplus组件设计系列之图标(ICON)(1)
2017/05/05 Javascript
vue实现某元素吸顶或固定位置显示(监听滚动事件)
2017/12/13 Javascript
浅谈 Vue 项目优化的方法
2017/12/16 Javascript
vue如何通过id从列表页跳转到对应的详情页
2018/05/01 Javascript
Vue刷新修改页面中数据的方法
2018/09/16 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
2019/01/21 Javascript
python读取csv文件示例(python操作csv)
2014/03/11 Python
python连接mysql实例分享
2016/10/09 Python
Python数据结构之图的应用示例
2018/05/11 Python
Python基于jieba库进行简单分词及词云功能实现方法
2018/06/16 Python
python使用xlsxwriter实现有向无环图到Excel的转换
2018/12/12 Python
Python线程之定位与销毁的实现
2019/02/17 Python
pytorch 彩色图像转灰度图像实例
2020/01/13 Python
详解Python 中的容器 collections
2020/08/17 Python
python用opencv 图像傅里叶变换
2021/01/04 Python
Python使用pyenv实现多环境管理
2021/02/05 Python
配置H5的滚动条样式的示例代码
2018/03/09 HTML / CSS
英国领先的杂志订阅网站:Magazine.co.uk
2018/01/25 全球购物
函授毕业自我鉴定
2013/12/19 职场文书
关于毕业的广播稿
2014/01/10 职场文书
经典而简洁的婚礼主持词
2014/03/13 职场文书
社区两委对照检查材料
2014/08/23 职场文书
学雷锋活动倡议书
2014/08/30 职场文书
银行委托书范本
2014/09/28 职场文书
学校党的群众路线教育实践活动整改措施
2014/10/25 职场文书