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

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

表单操作

取值

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

  <form id=‘form0‘></form>

  <form action="/login" method="post" target="blank" id=‘form1‘>

    <input type="text" name=‘user_name‘>  <!--field 0-->
    <input type="email" name=‘user_email‘>  <!--field 1-->
    <select  name=‘user_phone‘>  <!--field 2-->
      <option value=‘1‘>13333333331</option>
      <option value=‘2‘>13333333332</option>
      <option value=‘3‘>13333333333</option>
    </select>
    <input type="text" name=‘form0_user_phone‘ form=‘form0‘>  <!--field 3-->
    <button type=‘submit‘ form=‘form0‘>预览</button>  <!--field 4-->

    <button type=‘submit‘>提交</button>  <!--field 5-->

  </form>

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

alert(form1.action); => ‘/login‘
alert(form1.method); => ‘post‘
alert(form1.user_name.value) => ‘‘

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


// 属于本表单元素nodelist类数组,如果通过form属性指定到其他表单,不会算作本表单元素,下面获取到的元素是field 0,field 1,field 2,field 5
console.log(form1.elements);  => [<input>...,...,...</button>] 

// 属于本表单元素个数,如果通过form属性指定到其他表单,不会算作本表单元素
console.log(form1.length);  => 4 

// nodelist中下标为2的表单元素
console.log(form1[1]);  => <input type="email" name=‘user_email‘>

// 表单中 name=‘user_name‘ 的元素,有同名的字段则返回一个nodelst类数组
console.log(form1[‘user_name‘]);  => <input type="text" name=‘user_name‘> 或 nodelist

// 获取表单全部内容,详情见下面的 “提交” 条目
jQuery(‘#form1‘).serialize(); => user_name=&user_email=&user_phone=13333333331
jQuery(‘#form1‘).serializeArray(); => [] 一个数组,里面是每个字段的键值对
new FormData(form1) => 没有返回值

赋值

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

// 把表单提交到 "/signIn"
form1.action = ‘/signIn‘;

// 修改表单提交方式为 "GET"
form1.method = ‘GET‘;

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

// 将user_name的值设定为 "hello world"
form1.user_name.value = "hello world"; 

// 选中select中值为2的option
form1.user_phone.value = 2; 

重置

可以通过html或者JavaScript的方式把表单值重置为页面初始的样子。
html方式为点击 type=‘reset‘inputbutton。JavaScript的方式为 form1.reset()
如果表单中应用了第三方UI库如 select2 ,重置后还需要手动触发表单元素的change事件,以触发第三方库更新UI。常用的方式是:

form1.reset();
$(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() 手动提交一个表单。

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

技巧

不提交空字段

通过上方的表单提交规则可以知道,很多时候,无论是否填写了值,在提交的时候,该字段都会被提交到服务器。而在执行条件筛选表单提交的时候,由于常用的是GET请求,浏览器地址栏中通常会出现一长串字符。
这对于有洁癖的用户来说是无法忍受的,所以需要在提交表单前做一点小动作,让值为空的字段不提交到服务器。

// 本段代码使用了jquery

var form = $(‘form‘),
    fields = form.find(‘:input‘);

form.on(‘submit‘,function(event){
   event.preventDefault(); // 阻止默认事件,表单将不会提交到服务器
   fields.each(function(){
     if(!this.value.length) this.disabled = ‘disabled‘; // 含有disabled属性的表单字段将不会被提交
   });
   this.submit();
})

异步提交文件

一般而言,文件提交都是同步的,因为一般的表单序列化方法,无法传输二进制的文件。而如果要实现异步上传文件的需求,主要依靠两种方式。
一种是新建一个 iframe ,在里面通过一个独立的form表单上传文件后,再和主frame进行通信。另一种则是通过html5的 new FormData() 方法,append进去一个文件,或是直接读取表单信息。
利用 iframe 方式提交文件的较为知名的插件是 jquery.form.js 。通过 new FormData() 则简单了许多:

# 这是一个来自 MDN 的示例

// 原生JavaScript方式
var xhr = new XMLHttpRequest();
xhr.open("POST", form1.action);
xhr.send(new FormData(form1));

// 使用jquery的ajax()
$.ajax({
  url: form1.action,
  type: "POST",
  data: new FormData(form1),
  processData: false,  // 告诉jQuery不要去处理发送的数据
  contentType: false   // 告诉jQuery不要去设置Content-Type请求头
});

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

许多专门做文件上传的插件,会同时使用两种上传方式,以兼容不同浏览器。

参考资料

MDN

w3.org

本文转载于猿2048:form表单那点事儿(下) 进阶篇

原文地址:https://www.cnblogs.com/jlfw/p/12630733.html

时间: 2024-10-28 21:25:50

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

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

做为html中最为常见,应用最广泛的标签之一,form常伴随前端左右.了解更深,用的更顺. 目录: 表单属性 表单元素 常识 模拟外观 表单属性 这个表单展示了form表单常用的属性 属性名 属性值 描述 action 一个url地址 指定表单提交到的地址 method `GET` , `POST` 表单将以此种方法提交到服务器 target `_self` 当前页面 `_blank` 每次在新窗口打开 `blank` 每次在同一个新窗口打开 `_parent` 父级frame `_top` 顶

ubuntu 下CGI c语言 获取form表单的数据

前面文章:使用cgi c 写了一个helloworld 这次 主要使用CGI c语言 获取form表单的数据 1 login.c [email protected]:/usr/lib/cgi-bin$ cat login.c #include<stdio.h> #include<stdlib.h> #include <string.h> int main(){ int i,len=0; char poststr[100]; char m[10],n[10]; char

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

原文:解析:使用easyui的form提交表单,在IE下出现类似附件下载时提示是否保存的现象 之前开发时遇到的一个问题,使用easyui的form提交表单,在Chrome下时没问题的,但是在IE下出现类似附件下载时提示是否保存的现象. 这里记录一下如何解决的.其实这个现象不光是easyui的form,还有其他一些form插件也是一样的,使用不当就会遇到这个问题. 前台: <!DOCTYPE html> <html> <head> <meta http-equiv=

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

最近开发中碰到一个问题,项目中有几个列表展示页面,允许用户通过查询条件模糊查询数据.用户录入关键字后点击回车会调用查询方法根据关键字查询,原先功能没有问题,但是最近发现在查询输入框中按下回车会直接刷新页面不调用查询方法.检查发现有人在查询模块新增了一个form表单,找了很多和form表单相关资料才发现当form表单内只有一个type="text"类型的<input>标签时按下回车默认会提交form表单.解决方法很简单就是在form表单内新增一个隐藏的type="t

按Enter键后Form表单自动提交的问题

怪事年年有,今年特别多. 话说,最近项目中遇到一件怪事,当我鼠标focus在文本框中,轻轻敲了下回车键,尼玛页面突然刷新了,当时把宝宝给吓得. 接下来就是一番苦逼的烧脑和蛋疼~ 一.被表象所迷惑 突然出现这种情况,脑海中第一反应是,keydown事件是不是出问题了,然后找啊找啊找啊,然后没有然后. 在把input元素上的所有事件移除掉后,我自信的按了一下enter键.艾玛,又刷新了.心里那个苦哎. 二.列出所有可能 一阵捣鼓之后,脑海中列出了所有按下enter键后的改变,url改变,多了一个问号

ajax form表单提交 input file中的文件

ajax form表单提交 input file中的文件 现今的主流浏览器由于ajax提交form表单无法把文件类型数据提交到后台,供后台处理,可是开发中由于某些原因又不得不用ajax提交文件, 为了解决这个问题我走了不少弯路: 1.用原生的 input file , 不支持ajax上传文件,你肯定会说可以用 ajax form表单上传了呀?不过我后面还要调用上传成功后用js处理一些对话框,所以这种方法排除 2.用了 uploadify 上传插件,弄出来能上传东西,结果不理想:因为不能判断上传的

简约的form表单校验插件

前言 网上有好多form表单校验插件,包括jquery的表单检验插件,这些中好多插件功能很齐全强大,提示方式很酷,很美观好看.本想拿来用,但是发现几个问题: 1.使用不方便.校验规则繁多,调用校验函数难记忆. 2.提示方式固定.一般插件给出固定的几种提示方式,但是实际中,不同系统都有自己的页面风格样式,有自己的提示方式,插件自带的一般用不上. 因此,我最终没有采用这些插件,以免用后出现难以修改或实现的情况. 如果一种校验插件能避免以上两个问题最好了,方便使用,提示方式自定义 ,所以自己做了一个简

Form表单的子元素

Form表单用来上传数据,主要数据类型为文本字段.复选框.单选框.图片.文件等等,最后通常会有一个确认按钮,用以提交数据.不过数据在提交上服务器之前,通常会先经过脚本的验证.因此,确认按钮通常用来启动JavaScript脚本.在上传数据时,一定要设置对应控件的name属性,这样才能把数据传输到服务器端. Form表单中最常见到的子元素是input,input属于自关闭元素.通过设定其type属性,可以得到我们需要的不同控件: 1.<input type="text" />

form表单里如果只存在一个文本框,enter键提交

在这里说一说浏览器里form表单的默认行为 我们都知道浏览器是存在很多默认行为的,可能是出于常用行为考虑又或者是历史原因.但有时候我们不需要这些默认行为.以下: 1).当form表单里只存在一个input输入框时,回车会提交表单操作.  解决方法可以在form里面再加入一个隐藏的input输入框,或者把input从form里面放出来. 2).当form表单里有一个type=”submit”的按钮,回车会自动提交. 3).当form表单里的button按钮没有加type类型时,在ie下默认是but