form表单那点事儿(下) 进阶篇

上一篇主要温习了一下form表单的属性和表单元素,这一片主要讲解用JavaScript如何操作form。

目录:

表单操作

技巧

表单操作

取值

用JavaScript操作表单,免不了会有取值赋值操作,比如有以下表单:

  1. <form id='form0'></form>
  2. <form action="/login" method="post" target="blank" id='form1'>
  3. <input type="text" name='user_name'> <!--field 0-->
  4. <input type="email" name='user_email'> <!--field 1-->
  5. <select name='user_phone'> <!--field 2-->
  6. <option value='1'>13333333331</option>
  7. <option value='2'>13333333332</option>
  8. <option value='3'>13333333333</option>
  9. </select>
  10. <input type="text" name='form0_user_phone' form='form0'> <!--field 3-->
  11. <button type='submit' form='form0'>预览</button> <!--field 4-->
  12. <button type='submit'>提交</button> <!--field 5-->
  13. </form>

用JavaScript获取表单的属性值,或者表单字段的值,可以直接通过 elem.name 的方式

  1. alert(form1.action); => '/login'
  2. alert(form1.method); => 'post'
  3. alert(form1.user_name.value) => ''

而要获取表单中的字段,则通过:


  1. // 属于本表单元素nodelist类数组,如果通过form属性指定到其他表单,不会算作本表单元素,下面获取到的元素是field 0,field 1,field 2,field 5
  2. console.log(form1.elements); => [<input>...,...,...</button>]
  3. // 属于本表单元素个数,如果通过form属性指定到其他表单,不会算作本表单元素
  4. console.log(form1.length); => 4
  5. // nodelist中下标为2的表单元素
  6. console.log(form1[1]); => <input type="email" name='user_email'>
  7. // 表单中 name='user_name' 的元素,有同名的字段则返回一个nodelst类数组
  8. console.log(form1['user_name']); => <input type="text" name='user_name'> nodelist
  9. // 获取表单全部内容,详情见下面的 “提交” 条目
  10. jQuery('#form1').serialize(); => user_name=&user_email=&user_phone=13333333331
  11. jQuery('#form1').serializeArray(); => [] 一个数组,里面是每个字段的键值对
  12. new FormData(form1) => 没有返回值

赋值

表单本身的属性可以通过JavaScript赋值,比如 action , method , target 等。例如

  1. // 把表单提交到 "/signIn"
  2. form1.action = '/signIn';
  3. // 修改表单提交方式为 "GET"
  4. form1.method = 'GET';

而给表单元素赋值,则是通过 elem.value 的方式,例如

  1. // 将user_name的值设定为 "hello world"
  2. form1.user_name.value = "hello world";
  3. // 选中select中值为2的option
  4. form1.user_phone.value = 2;

重置

可以通过html或者JavaScript的方式把表单值重置为页面初始的样子。

html方式为点击 type='reset'inputbutton

JavaScript的方式为 form1.reset()

如果表单中应用了第三方UI库如 select2 ,重置后还需要手动触发表单元素的change事件,以触发第三方库更新UI。

常用的方式是:

  1. form1.reset();
  2. $(form1.user_phone).change();

校验

传统校验

传统的表单校验方式是通过监听的 submit 事件或是表单字段的 input , focus , blur , change 事件,去触发JavaScript中指定的校验规则,来确定表单是提交还是拒绝提交。

html5校验

步入html5时代之后,可以仅通过html本身完成表单提交前的校验工作。方式是给表单字段加上 requiredpattern 属性,

required 是告诉浏览器这个字段需要校验,而 pattern 则指定一个正则表达式形式的校验规则。在表单提交时,浏览器会自动进行一系列的校验工作,没有通过校验的表单是无法提交到服务器的。

在表单提交之前,可以通过 form.checkValidity() 方法,这个方法会返回一个布尔值回馈整个表单是否通过了校验规则。

比较知名的表单校验插件是 jquery-validation

提交

提交规则

提交表单时,表单拥有的字段会按照method中的指定方式提交给服务器,而表单提交的字段规则是

表单元素 type
规则
<input>
button
永远不提交
<input> checkbox 只在勾选后提交
<input> file 永远提交,即使为空值
<input> hidden 永远提交,即使为空值
<input> image 永远提交,即使为空值
<input> password 永远提交,即使为空值
<input> radio 只在勾选后提交,如果一组Radio没有任何勾选,全部不提交。
<input> reset 永远不提交
<input> submit 点击哪个按钮,则提交这个按钮的值,其他的SUBMIT按钮值都不提交。
如果表单的提交行为是由JavaScript脚本触发的,则不提交任何值。
<input> text 永远提交,即使为空值
<button>
button
永远不提交
<button> reset 永远不提交
<button> submit 点击哪个按钮提交表单,则提交这个按钮的值。
如果省略TYPE,IE默认为BUTTON,火狐默认SUBMIT。
<select>
-
永远提交,即使为空值。
<textarea>
- 永远提交,即使为空值。

表格中没有提到的规则还有:

  • 具有disabled属性的字段不会被提交
  • 不具有name属性的字段不会被提交
  • 同名的name属性会发生覆盖,radio和checkbox除外
  • form指向其他表单的字段,不会被本表单提交

规则来源 http://www.cnblogs.com/manors/archive/2010/03/11/1683727.html

表单序列化

GET方法提交表单,表单字段会被encodeURIComponent转换,并在url中显示出来。而post方法提交表单,会在请求body中发送表单字段键值对。

在通过JavaScript异步提交表单时,如何按照上面的规则去获取表单数据,jquery提供了 serialize()serializeArray() 两个方法。使用该方法会取得和原生表单一致的提交字段。

表单提交事件

表单提交到服务器时,会触发 submit 事件。也可以通过 form.submit() 手动提交一个表单。

  1. form1.onsubmit = function(event){
  2. event.preventDefault(); // 阻止默认事件,表单将不会提交到服务器
  3. if(confirm('你真的要提交我吗~')){
  4. this.submit(); // 点击确定后,表单会被提交
  5. }
  6. }

技巧

不提交空字段

通过上方的表单提交规则可以知道,很多时候,无论是否填写了值,在提交的时候,该字段都会被提交到服务器。而在执行条件筛选表单提交的时候,由于常用的是GET请求,浏览器地址栏中通常会出现一长串字符。

这对于有洁癖的用户来说是无法忍受的,所以需要在提交表单前做一点小动作,让值为空的字段不提交到服务器。

  1. // 本段代码使用了jquery
  2. var form = $('form'),
  3. fields = form.find(':input');
  4. form.on('submit',function(event){
  5. event.preventDefault(); // 阻止默认事件,表单将不会提交到服务器
  6. fields.each(function(){
  7. if(!this.value.length) this.disabled = 'disabled'; // 含有disabled属性的表单字段将不会被提交
  8. });
  9. this.submit();
  10. })

异步提交文件

一般而言,文件提交都是同步的,因为一般的表单序列化方法,无法传输二进制的文件。而如果要实现异步上传文件的需求,主要依靠两种方式。

一种是新建一个 iframe ,在里面通过一个独立的form表单上传文件后,再和主frame进行通信。另一种则是通过html5的 new FormData() 方法,append进去一个文件,或是直接读取表单信息。

利用 iframe 方式提交文件的较为知名的插件是 jquery.form.js 。通过 new FormData() 则简单了许多:

  1. # 这是一个来自 MDN 的示例
  2. // 原生JavaScript方式
  3. var xhr = new XMLHttpRequest();
  4. xhr.open("POST", form1.action);
  5. xhr.send(new FormData(form1));
  6. // 使用jquery的ajax()
  7. $.ajax({
  8. url: form1.action,
  9. type: "POST",
  10. data: new FormData(form1),
  11. processData: false, // 告诉jQuery不要去处理发送的数据
  12. contentType: false // 告诉jQuery不要去设置Content-Type请求头
  13. });

更多用法请参考 MDN--使用FormData对象

参考资料

MDN

w3.org

form表单那点事儿(下) 进阶篇的更多相关文章

  1. form表单那点事儿(上) 基础篇

    form表单那点事儿(上) 基础篇 做为html中最为常见,应用最广泛的标签之一,form常伴随前端左右.了解更深,用的更顺. 目录: 表单属性 表单元素 常识 模拟外观 表单属性 这个表单展示了fo ...

  2. Django框架form表单的那些事儿

    Form那些事儿 创建Form类时,主要涉及到 [字段] 和 [插件],字段用于对用户请求数据的验证,插件用于自动生成HTML; 1:initial 初始值,input框里面的初始值. class L ...

  3. form表单上传图片问题:线下可以而线上不可以

    由于上传图片需要一定时间,而线下速度快线上速度慢. 所以如果你的上传窗口是弹出界面,那么就会面临上传未完成就关闭了该界面.导致上传失败.

  4. Form表单元素

    Form表单元素 action method input: name value type: text password button radio checkbox file submit reset ...

  5. 解析:使用easyui的form提交表单,在IE下出现类似附件下载时提示是否保存的现象

    之前开发时遇到的一个问题,使用easyui的form提交表单,在Chrome下时没问题的,但是在IE下出现类似附件下载时提示是否保存的现象. 这里记录一下如何解决的.其实这个现象不光是easyui的f ...

  6. 按下回车默认提交form表单问题

    最近开发中碰到一个问题,项目中有几个列表展示页面,允许用户通过查询条件模糊查询数据.用户录入关键字后点击回车会调用查询方法根据关键字查询,原先功能没有问题,但是最近发现在查询输入框中按下回车会直接刷新 ...

  7. form表单下的button按钮会自动提交表单的问题

    form表单下的button按钮会自动提交表单的问题 2017年01月05日 18:02:44 蓝色水 阅读数:18012更多 个人分类: asp.net   form表单下的按钮在没有指定type类 ...

  8. html-4, form 表单 输入、传文件、单选、多选、下拉菜单、文本描述、重置、submit、按钮限制输入

    <!-- form HTTP协议 action:提交的服务器网址 method:get(默认)| post(应用:登录注册.上传文件) 页面中的a img link 默认是get请求 input ...

  9. jquery下的提交,点击按钮没反应,post方法不执行 JSON方式在FORM表单下不起作用

    jquery下的提交,点击按钮没反应,post方法不执行 JSON方式在FORM表单下不起作用

随机推荐

  1. [CareerCup] 10.5 Web Crawler 网络爬虫

    10.5 If you were designing a web crawler, how would you avoid getting into infinite loops? 这道题问如果让我们 ...

  2. c# 技巧之 泛型方法

    泛型 指的是编译时不需要指定具体的参数类型,可以在运行时动态地赋予某一种数据类型的机制.  相信很多人对泛型类并不陌生,像Dictionary,List等结构都属于泛型类.有趣的是,一个函数/方法也可 ...

  3. C/C++程序从编译到链接的过程

    编译器是一个神奇的东西,它能够将我们所编写的高级语言源代码翻译成机器可识别的语言(二进制代码),并让程序按照我们的意图按步执行.那么,从编写源文件代码到可执行文件,到底分为几步呢?这个过程可以总结为以 ...

  4. PHP+memcache扩展(集成环境wampserver环境下)

    按照别人的步骤,安装和配置后没有任何的错误提示!在计算机服务里面也看到memcached服务已经开启,但是phpinfo里面就是没有memcache已经安装成功的信息!后来才发现原来是没有开启wamp ...

  5. sql 随机函数newid()

    newid()返回的是uniqueidentifier类型的唯一值.newid()每次产生的值都不一样 从表中随机获取前N条记录 select top N *  from table_name ord ...

  6. EasyUI——实现展示后台数据代码

    下面是View显示代码: @{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml" ...

  7. 自定义的 ListBoxItem 自适应ListBox的宽度

    主要是要设置HorizontalContentAlignment的值,而不是HorizontalAlignment <ListBox x:Name="xxx"> < ...

  8. 开课选课系统APP基本功能实现

    队员:031302511 031302505 效果图如下:        上述功能分析: 功能分析:我们考虑到手机自带的SQLite会被清理软件清理掉数据,这样就没有实际用处.所以我们就自己搭建服务器 ...

  9. MVC学习Day01

    ~~~~ =============================================================================================== ...

  10. FastDFS在.Net平台上的使用

    上一篇,了解了FastDFS是什么东东,一般稍微大一的网站都会做文件分离存储,FastDFS这轻型的分布式文件存储方式,非常有用. 此图片截取博友(张占岭)的勿喷 下面我们就了解一下,FastDFS在 ...