本文是对 JavaScript 高级程序设计 一书中相关章节的整理,加上自己的理解
1. 属性和方法
在 HTML 中,表单是由 <form>
元素来表示的,在 JavaScript 中,它与其他 HTML 元素具有相同的默认属性。不过它也有自己独有的属性和方法。
属性/方法 | 说明 |
---|---|
method | 要发送的 HTTP 请求类型,通常是“get”或“post” |
action | 接受请求的 URL |
name | 表单的名称,主要用于 document.forms.name 获取表单来用 |
elements | 表单中所有控件的集合(HTMLCollection 集合)(input、fieldset、select、textarea 等) |
length | 表单中控件的数量 (等于 elements.length) |
enctype | 请求编码的类型 |
acceptCharset | 服务器能够处理的字符串 |
target | 用于发送请求和接收响应的窗口名称 |
autocomplete | on/off 表示是否在输入时出现候选框 |
reset() | 将所有表单域重置为默认值 |
submit() | 提交表单 |
2. 获取表单
通过
getElementById()
获取// 取得页面中 id 为 'form1' 的表单var form = getElementById("form1");通过 document.forms 获取页面中所有的表单的一个集合,然后通过数字索引 或 name 值来取得特定的表单
// 取得页面中所有表单中的第一个表单var firstForm = document.forms[0];// 取得页面中所有表单中 name 值为 'form2' 的表单var myForm = document.forms["form2"];
3. 提交表单
用户单击提交按钮或图像按钮时,就会提交表单。
3.1 提交按钮
使用 <input>
或 <button>
可以定义提交按钮,只要将 type 值设置为 “submit” 即可。
3.2 图像按钮
图像按钮是通过将 <input>
的 type 特性值设置为 “image” 来定义。
3.3 提交前验证
通过按钮的方式提交表单时,浏览器会在将请求发送到服务器之前触发 submit 事件。这样我们就可以有机会通过这个事件的处理程序验证表单,并根据验证的结果来决定是否提交表单。(阻止这个事件的默认行为就可以取消表单的提交)
上面的代码为表单的 submit 事件添加了一个处理程序,经历一系列的验证后,如果没有通过验证则取消提交。注意,这里的 submit 事件要注册到表单元素(<form>
)上。
其中,添加事件处理程序的方法为前面文章中跨浏览器的解决方案。
3.4 编程方式提交
这种方式无需表单包含提交按钮,任何时候都可以正常提交表单:
这种方法提交表单,不会触发 submit 事件,因此就记得在调用此方式前先验证表单数据。
3.5 提交表单的问题
提交表单可能出现的最大问题可能是 用户重复提交,两个解决方案:
在第一次提交表单后就禁用提交按钮
var subBtn = document.getElementById("myBtn");EventUtil(subBtn, "click", function() {this.disabled = true;});取消后续的表单提交操作
var form = document.getElementById("form1");var flag = false;// 为表单注册一个 submit 事件,点击提交按钮时会触发EventUtil.addHandler(form, "submit", function(event) {event = EventUtil.getEvent(event);// 如果 flag 值变为 true(提交一次后会变),取消提交操作if (flag) {EventUtil.preventDefault(event);}flag = true;});
4. 重置表单
4.1 重置按钮
|
这两个按钮都可以用来重置表单。在重置表单时,所有表单字段都会恢复到页面刚加载完毕时的初始值。
4.2 重置前验证
用户单击重置按钮重置表单时,会像单击提交按钮触发 submit 事件那样触发 reset 事件。利用这个机会,我们可以在重置表单之前进行验证,在必要时取消重置。
4.3 编程方式重置
与提交表单一样,也可以通过 JavaScript 来重置表单,如下:
与调用 submit 方法不同的是,调用 reset 方法会向单击重置按钮一样触发 reset 事件。
5. 获取表单控件(表单字段)
通过 form.elements 获取当前表单中所有的控件,然后根据数据索引值或 name 值来获取特定的控件
// 取得页面中 id 为 'form1' 的表单var form = getElementById("form1");// 获取当前表单中第一个控件var firstC = form.elements[0];// 获取当前表单中 name 为 `myC` 的控件var myC = form.elements["myC"];直接通过 form 元素通过根据数据索引值或 name 来获取特定控件
// 获取当前表单中第一个控件,忽略其它不是控件的元素var firstC = form[0];// 取得页面中 id 为 'form1' 的表单var form = getElementById("form1");// 获取当前表单中 name 为 `myC` 的控件var myC = form["myC"];需要注意的是,如果当前表单中没有 name 为
myC
的控件,那么就会获取 id 为myC
的 img 元素。
如果有多个同名元素,则返回这些元素的动态节点的集合