Web表单在HTML中以元素表示,在JavaScript中则以HTMLFormElement类型表示。
HTMLFormElement类型继承自HTMLElement类型,因此拥有与其它HTML元素一样的默认属性,不过,HTMLFormElement也有自己的属性和方法。
//通用提交表单
<input type="submit" value="Submit Form">
//自定义按钮提交表单
<button type="submit">Submit Form</button>
如果表单中有上述任何一个按钮,且焦点在表单中某个控件上,则按回车键就可以提交表单。阻止这个事件的默认行为可以取消提交表单。
let form = document.getElementById("myForm");
form.addEventListener("submit",(event) => {
//阻止表单提交
event.preventDefault();
});
调用preventDefault()就可以阻止表单提交。
也可以通过submit()方法提交表单。
let form = document.getElementById("myForm");
form.submit();
事件提交的最大问题是如何避免二次提交。
如果提交表单之后没有什么反应,用户可能会进行第二次点击,甚至更多次,结果肯定是很烦人的,比如服务器要处理重复的请求,甚至可能造成损失(比如用户在购物,则可能会下多个单,引起不必要的客户投诉。)。解决这个问题的方式,① 在表单提交后禁用提交按钮。② 通过onsubmit()事件处理程序取消之后的表单提交。
let form = document.getElementById("myForm");
let field = form.elements[0];
field.value = "zhangsan";
//给字段设置焦点
field.focus();
//禁用字段
field.disabled = true;
避免多出提交的代码:
let form = document.getElementById("myForm");
for.addEventListener("submit",(event) => {
let target = event.target;
let btn = target.elements["submit"];
btn.disabled = true;
});
以上代码在表单的submit事件上注册了一个事件处理程序,当submit事件触发时,代码会取得提交按钮,然后将其disabled属性设置为true。注意,这个功能不能通过直接给提交按钮添加onclick事件处理程序来实现,原因是不同浏览器触发事件的时机不一样。有些浏览器会在触发表单的submit事件前先触发提交按钮的click事件,有些浏览器则会后触发click事件,对于先触发click事件的浏览器,这个按钮会在表单提交前被禁用,这就意味着表单不会被提交了。因此最好使用表单的submit事件来禁用提交按钮。
每个表单字段都有两个公共方法:focus()
和blur()
。
focus()
方法把浏览器焦点设置到表单字段,这意味着该字段会变成活动字段并可以响应键盘事件。
blur()
是focus()
的反向操作,从元素上移除焦点。
和
元素的value发生变化且失去焦点时触发,或者在
元素中选中项发生变化时触发;下面代码屏蔽所有按键的输入:
textbox.addEventListener("keypress",(event) => {
event.preventDefault();
});
运行以上代码会让文本框编程只读,因为所有按键都被屏蔽了。如果想只屏蔽部分特定字符,则需要检查事件的charCode属性,以确定正确的回应方式。
例如,下面就是只允许输入数字的代码:
textbox.addEventListener("keypress",(event) => {
if(!/\d/.test(String.fromCharCode(event.charCode))){
event.preventDefault();
}
});
上述代码先用String.fromCharCode()把事件的charCode转换为字符串,再用正则表达式/\d/
来测试。
这个正则表达式匹配所有数字字符。
JavaScript可以通过很多方式增强表单字段的易用性,最常见的是在当前字段完成时自动切换到下一个字段,比如对于已知长度的输入框,比如手机号码,在中国手机号码都是11位,可以在手机号码输入框到达11个字符时,自动把焦点移到下一个输入框。
type="email"
;type="url"
;除了email和url,HTML5还定义了其它几种新的输入元素类型,它们都是期待某种数据输入的,比如number、range、datetime、datetime-local、date、month、week、time
。
HTML5为文本字段新增了pattern属性,这个属性用于指定一个正则表达式,用户输入的文本必须与之匹配。例如只能在文本中输入数字,
使用checkValidity()
方法可以检测表单中任意给定字段是否有效。这个有效性检测是针对前面提到的约束API,如果字段有效就会返回true,否则返回false。
if(document.form[0].elements[0].checkValidity()){
//字段有效
}else{
//字段无效
}
checkValidity()方法只会告诉我们字段是否有效,而validity属性会告诉我们字段为什么有效或者无效。这个属性是一个对象,包含一系列返回布尔值的属性。
通过特定noValidate属性可以禁止对表单进行任何验证。
document.form[0].noValidate = true;//关闭验证
选择框是使用和
创建的。
常见属性和方法: