js表单处理中单选、多选、选择框值的获取及表单的序列化


Posted in Javascript onMarch 08, 2016

本文总结了下在表单处理中单选、多选、选择框值的获取及表单的序列化,写成了一个对象。如下:

var formUtil = {
  // 获取单选按钮的值,如有没有选的话返回null
  // elements为radio类的集合的引用
  getRadioValue:function(elements) {
   var value = null; // null表示没有选中项
   // 非IE浏览器
   if(elements.value != undefined && elements.value != '') {
    value = elements.value;
   } else {
    // IE浏览器
    for(var i = 0, len = elements.length; i < len; i++ ) {
     if(elements[i].checked) {
      value = elements[i].value;
      break;
     }
    }
   }
   return value;
  },
  
  // 获取多选按钮的值,如有没有选的话返回null
  // elements为checkbox类型的input集合的引用
  getCheckboxValue:function(elements) {
   var arr = new Array();
   for(var i = 0, len = elements.length; i < len; i++ ) {
    if(elements[i].checked) {
     arr.push(elements[i].value);
    }
   }
   if(arr.length > 0) {
    return arr.join(',');
   } else {
    return null; // null表示没有选中项
   } 
  },
  
  // 获取下拉框的值
  // element为select元素的引用
  getSelectValue:function(element) {
   if(element.selectedIndex == -1) {
    return null; // 没有选中的项时返回null
   };
   if(element.multiple) {
    // 多项选择
    var arr = new Array(), options = element.options;
    for(var i = 0, len = options.length; i < len; i++) {
     if(options[i].selected) {
      arr.push(options[i].value);
     }
    }
    return arr.join(",");
   }else{
    // 单项选择
    return element.options[element.selectedIndex].value;
   }
  },
  
  // 序列化
  // form为form元素的引用
  serialize:function(form) {
   var arr = new Array(),
   elements = form.elements,
   checkboxName = null;
   for(var i = 0, len = elements.length; i < len; i++ ) {
    field = elements[i];
    // 不发送禁用的表单字段
    if(field.disabled) {
     continue;
    }
    switch (field.type) {
     // 选择框的处理
     case "select-one":
     case "select-multiple":
      arr.push(encodeURIComponent(field.name) + "=" + encodeURIComponent(this.getSelectValue(field)));
      break;
     
     // 不发送下列类型的表单字段 
     case undefined :
     case "button" :
     case "submit" :
     case "reset" :
     case "file" :
      break;
     
     // 单选、多选和其他类型的表单处理  
     case "checkbox" :
      if(checkboxName == null) {
       checkboxName = field.name;
       arr.push(encodeURIComponent(checkboxName) + "=" + encodeURIComponent(this.getCheckboxValue(form.elements[checkboxName])));
      }
      break;
     case "radio" :
      if(!field.checked) {
       break;
      }
     default:
      if(field.name.length > 0) {
       arr.push(encodeURIComponent(field.name) + "=" + encodeURIComponent(field.value));
      } 
    }
   }
   return arr.join("&");
  } 
 };

一个简单的demo:

<form action="test_php.php" id="form1" name="form1" method="post" enctype="multipart/form-data">
  姓名:<input name="name" type="text" tabindex="1" /> <br>
  性别:<input name="sex" type="radio" value="男"/> 男 
    <input name="sex" type="radio" value="女" /> 女 <br>
  爱好:
  <input name="hobby" type="checkbox" value="篮球" /> 篮球
  <input name="hobby" type="checkbox" value="足球" /> 足球
  <input name="hobby" type="checkbox" value="乒乓球" /> 乒乓球
  <input name="hobby" type="checkbox" value="羽毛球" /> 羽毛球
  <br />
  年级:
  <select name="class" multiple>
   <option value="一年级">一年级</option>
   <option value="二年级">二年级</option>
   <option value="三年级">三年级</option>
  </select>
  <br />
   其他:
   <br />
   <textarea name="other" rows="5" cols="30" tabindex="2"></textarea>
   <br />
   <input type="reset" value="重置" />
   <input type="submit" value="提交" />
 </form>
 <div id="output"></div>
var form = document.getElementById("form1"),
 output = document.getElementById("output");
 
 // 自定义的提交事件
 EventUtil.addEventListener(form,"submit", function(event) {
  event = EventUtil.getEvent(event);
  EventUtil.preventDefault(event);
  var html = "";
  html += form.elements['name'].value + "<br>";
  html += formUtil.getRadioValue(form.elements['sex']) + "<br>";
  html += formUtil.getCheckboxValue(form.elements['hobby']) + "<br>";
  html += formUtil.getSelectValue(form.elements['class']) + "<br>";
  html += form.elements['other'].value + "<br>";
  html += decodeURIComponent(formUtil.serialize(form)) + "<br>";
  output.innerHTML = html;
 });

如果大家还想继续学习的话,请参考以下专题《javascript选择框操作》《jquery选择框操作》

以上就是针对js表单处理中单选、多选、选择框值的获取及表单的序列化封装的对象,希望对打击的学习有所帮助。

Javascript 相关文章推荐
JavaScript语句可以不以;结尾的烦恼
Mar 08 Javascript
JavaScript避免代码的重复执行经验技巧分享
Apr 17 Javascript
jQuery zclip插件实现跨浏览器复制功能
Nov 02 Javascript
JavaScript操作select元素和option的实例代码
Jan 29 Javascript
JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法
Apr 18 Javascript
jQuery图片左右滚动代码 有左右按钮实例
Jun 20 Javascript
Node.js 实现简单小说爬虫实例
Nov 18 Javascript
js+html获取系统当前时间
Nov 10 Javascript
Laravel整合Bootstrap 4的完整方案(推荐)
Jan 25 Javascript
vue项目实现记住密码到cookie功能示例(附源码)
Jan 31 Javascript
node.JS路径解析之PATH模块使用方法详解
Feb 06 Javascript
node.js中stream流中可读流和可写流的实现与使用方法实例分析
Feb 13 Javascript
JS实现设置ff与ie元素绝对位置的方法
Mar 08 #Javascript
Angularjs material 实现搜索框功能
Mar 08 #Javascript
jQuery控制frames及frame页面JS的方法
Mar 08 #Javascript
三种Node.js写文件的方式
Mar 08 #Javascript
javascript创建对象、对象继承的实用方式详解
Mar 08 #Javascript
理解javascript正则表达式
Mar 08 #Javascript
JavaScript实现带播放列表的音乐播放器实例分享
Mar 07 #Javascript
You might like
用Socket发送电子邮件
2006/10/09 PHP
如何删除多级目录
2006/10/09 PHP
php数组函数序列之array_unshift() 在数组开头插入一个或多个元素
2011/11/07 PHP
php实现斐波那契数列的简单写法
2014/07/19 PHP
一个简单至极的PHP缓存类代码
2015/10/23 PHP
PHP获取文件扩展名的4种方法
2015/11/24 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
2017/09/21 PHP
JavaScript 构造函数 面相对象学习必备知识
2010/06/09 Javascript
javascript中replace( )方法的使用
2015/04/24 Javascript
javascript中Function类型详解
2015/04/28 Javascript
javascript实现抽奖程序的简单实例
2016/06/07 Javascript
AngularJS 作用域详解及示例代码
2016/08/17 Javascript
JavaScript 链式结构序列化详解
2016/09/30 Javascript
深入理解javascript中concat方法
2016/12/12 Javascript
JS实现页面中所有img对象添加onclick事件及新窗口查看图片的方法
2016/12/27 Javascript
Vue中fragment.js使用方法详解
2017/03/09 Javascript
大白话讲解JavaScript的Promise
2017/04/06 Javascript
Cookies 和 Session的详解及区别
2017/04/21 Javascript
解决OneThink中无法异步提交kindeditor文本框中修改后的内容方法
2017/05/05 Javascript
JavaScript实现区块链
2018/03/14 Javascript
使用async await 封装 axios的方法
2018/07/09 Javascript
Node.js如何对SQLite的async/await封装详解
2019/02/14 Javascript
通过实例解析JavaScript for in及for of区别
2020/06/15 Javascript
Python 功能和特点(新手必学)
2015/12/30 Python
详解python列表生成式和列表生成式器区别
2019/03/27 Python
python for和else语句趣谈
2019/07/02 Python
详解python实现小波变换的一个简单例子
2019/07/18 Python
Python常用数据类型之间的转换总结
2019/09/06 Python
python利用opencv实现SIFT特征提取与匹配
2020/03/05 Python
4行Python代码生成图像验证码(2种)
2020/04/07 Python
python爬虫中采集中遇到的问题整理
2020/11/27 Python
致100米运动员广播稿
2014/02/14 职场文书
干部鉴定材料
2014/05/18 职场文书
员工年终自我评价
2014/09/14 职场文书
SpringBoot整合MongoDB的实现步骤
2021/06/23 MongoDB
手把手带你彻底卸载MySQL数据库
2022/06/14 MySQL