利用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的面向对象(二)
Nov 09 Javascript
JavaScript 中的replace方法说明
Apr 13 Javascript
在IE,Firefox,Safari,Chrome,Opera浏览器上调试javascript
Dec 02 Javascript
jquery实现图片等比例缩放以及max-width在ie中不兼容解决
Mar 21 Javascript
动态加载iframe时get请求传递中文参数乱码解决方法
May 07 Javascript
详细分析JavaScript变量类型
Jul 08 Javascript
浅谈javascript的Touch事件
Sep 27 Javascript
js调用父框架函数与弹窗调用父页面函数的简单方法
Nov 01 Javascript
浅谈Vue2.0父子组件间事件派发机制
Jan 08 Javascript
在mpvue框架中使用Vant WeappUI组件库的注意事项【推进】
Jun 09 Javascript
vue学习笔记之slot插槽用法实例分析
Feb 29 Javascript
vue+elementUI(el-upload)图片压缩,默认同比例压缩操作
Aug 10 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+JS实现缩放图片式截图的实现
2010/03/07 PHP
探讨:如何通过stats命令分析Memcached的内部状态
2013/06/14 PHP
浅析php中jsonp的跨域实例
2013/06/21 PHP
去掉destoon资讯内容页keywords关键字自带的文章标题的方法
2014/08/21 PHP
java微信开发之上传下载多媒体文件
2016/06/24 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
2016/09/22 PHP
参考:关于Javascript中实现暂停的几篇文章
2007/03/04 Javascript
Js获取下拉框选定项的值和文本的实现代码
2014/02/26 Javascript
分享一则javascript 调试技巧
2015/01/02 Javascript
JavaScript截断字符串的方法
2015/07/15 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
2016/06/13 Javascript
手动初始化Angular的模块与控制器
2016/12/26 Javascript
js分页之前端代码实现和请求处理
2017/08/04 Javascript
JavaScript实现的原生态兼容IE6可调可控滚动文字功能详解
2017/09/19 Javascript
详解Chart.js轻量级图表库的使用经验
2018/05/22 Javascript
Vue.js组件高级特性实例详解
2018/12/24 Javascript
node app 打包工具pkg的具体使用
2019/01/17 Javascript
jQuery中实现text()的方法
2019/04/04 jQuery
前后端常见的几种鉴权方式(小结)
2019/08/04 Javascript
JavaScript逻辑运算符相关总结
2020/09/04 Javascript
详解JavaScript 的执行机制
2020/09/18 Javascript
Python复制目录结构脚本代码分享
2015/03/06 Python
python输出当前目录下index.html文件路径的方法
2015/04/28 Python
python中input()与raw_input()的区别分析
2016/02/27 Python
python查看模块安装位置的方法
2018/10/16 Python
Python装饰器语法糖
2019/01/02 Python
解决Python设置函数调用超时,进程卡住的问题
2019/08/08 Python
Python K最近邻从原理到实现的方法
2019/08/15 Python
Python aiohttp百万并发极限测试实例分析
2019/10/26 Python
纯DOM+CSS3实现简单的小风车动画
2016/09/27 HTML / CSS
CSS3 简写animation
2012/05/10 HTML / CSS
canvas进阶之如何画出平滑的曲线
2018/10/15 HTML / CSS
EQVVS官网:设计师男装和女装
2018/10/24 全球购物
香港莎莎官网Sasa.com:亚洲著名国际化妆品商城
2019/11/10 全球购物
美术专业自荐信
2014/07/07 职场文书
2014领导班子“四风问题”对照检查材料思想汇报(执法局)
2014/09/21 职场文书