前端魔法堂:onsubmit和submit事件处理函数怎么不生效呢?
前言
最近在用Polymer增强form,使其支持表单的异步提交,但发现明明订阅了onsubmit和submit事件,却怎么也触发不了。下面我们将一一道来。
提交表单的方式
- 表单仅含一个以下的元素时,该元素得到焦点,按回车键,即可发起表单提交。
input[type=text]
input[type=password]
input[type=email]
input[type=url]
input[type=tel]
input[type=number]
input[type=search]
示例:
<form>
<label for="name"></label>
<input type="text" id="name" name="name">
<select id="sex" name="sex">
<option value="0">male</option>
<option value="1">female</option>
</select>
</form>
- 表单含两个或以上的上述元素时,在表单中添加一个
input[type=submit]
子元素,或在表单外添加一个input[type=submit form=表单ID]
的元素,那么当上述元素得到焦点,按回车键,即可发起表单提交。
示例:
<form>
<label for="name"></label>
<input type="text" id="name" name="name">
<label for="age"></label>
<input type="number" id="age" name="age" value="0">
<input type="submit" value="submit">
</form>
将input[type=submit]
换成button
效果一样,IE下button
的type属性默认为button,其他浏览器(W3C标准)则是submit。
因此使用button时记得显式设置type属性值。
- 通过调用表单元素的
submit
方法。
示例:
<form>
<label for="name"></label>
<input type="text" id="name" name="name">
<label for="age"></label>
<input type="number" id="age" name="age" value="0">
<input type="button" value="submit">
</form>
<script>
var btn = document.querySelector('input[type="button"]')
, form = document.querySelector('form')
btn.addEventListener('click', function(e){
form.submit()
})
</script>
- 通过触发表单的submit事件
示例1, IE 678:
var form = document.querySelector('form')
form.fireEvent('onsubmit')
form.submit()
示例2,DOM Level 2 Event
var e = document.createEvent('HTMLEvents')
e.initEvent('submit', true, true)
var form = document.querySelector('form')
form.dispatchEvent(e)
示例3,DOM Level 3 Event
var e = new Event('submit')
var form = document.querySelector('form')
form.dispatchEvent(e)
示例4,jQuery
$('form').trigger('submit')
各种提交方式的背后
就onsubmit函数和submit事件而言
- 方式1,方式2和方式4均可依次调用onsubmit函数和触发submit事件,因此可以在onsubmit函数或submit事件处理函数中禁止执行默认行为来实现表单的异步提交;
- 方式3既不会调用onsubmit函数,也不会触发submit事件。
还有HTML5表单合法性验证呢!
HTML5对表单作了增强,其中最耀眼的可谓是合法性验证这一部分。首先我们要明确一点的是,验证发生在与input等表单控件发生交互时(输入,点击,脚本修改其值等),而不是提交表单时才触发验证。然后再根据表单的配置和触发表单提交的方式,决定合法性验证的结果是否会阻止表单的提交。
前提:form.novalidate为false
<form>
<input type="text" id="name" name="name" required>
</form>
- 方式1和方式2,若
input#name
内容为空,则弹出非法内容警告,并阻止表单提交,不执行onsubmit和触发submit事件 - 方式3,直接提交表单
- 方式4,若
input#name
内容为空,不弹出非法内容警告,更不会阻止表单提交, 而是执行onsubmit和触发submit事件
因此要方式4实现与方式1,2的效果可以这样处理
var e = new Event('submit')
var form = document.querySelector('form')
form.addEventListener('submit', function(e){
if (!form.novalidate && form.reportValidity()){
e.preventDefault()
}
})
form.dispatchEvent(e)
到这里对表单提交的方式和不同方式引起后续不同的效果有了解,但不稍微深入上面引入关于合法性验证的内容心里总是发痒,下面我们继续挖一挖吧!
说说HTML5下的表单合法性验证
说到合法性验证,那必须说到一个新增的类型ValidityState
@interface ValidityState
@description input等表单控件通过validity属性获取
@prop {Boolean} valid - 内容是否符合规定
@prop {Boolean} valueMissing - 是否违反必填约束
@prop {Boolean} typeMismatch - 是否违反类型约束,如type=url|email|number等约束
@prop {Boolean} badInput - 是否为无效输入(无法转换为目标类型),如number输入了非数字
@prop {Boolean} tooLong - 是否超长
@prop {Boolean} tooShort - 是否长度不足
@prop {Boolean} stepMismatch - 是否符合step值设置的间隔
@prop {Boolean} rangeUnderflow - 是否小于最小值
@prop {Boolean} rangeOverflow - 是否大于最大值
@prop {Boolean} patternMismatch - 是否违反正则
@prop {Boolean} customError - 是否存在自定义错误信息
另外,表单控件还有其他属性、方法和事件是和合法性验证相关的
@prop {Boolean} willValidate - 是否启用合法性校验,只要设置了required等合法性验证属性即表示启用
@prop {String} validationMessage - 校验失败时的提示信息
@method setCustomValidity([{String} msg='']):undefined - 设置自定义错误信息,设置为undefined或空字符串,表示不存在自定义错误信息
@event invalid - 调用表单控件的checkValidity()或reportValidity(),非法时触发该事件
下面的方法,form和input等表单控件均拥有
@method checkValidity():Boolean - 检查是否符合校验约束,若不符合则触发相应的表单控件的invalid事件
form.addEventListener('submit', function(){
form.checkValidity()
})
@method reportValidity():Boolean - 功能和checkValidity一样,但另外会以浏览器定义的方式显示提示信息
总结
尊重原创,转载请注明来自:尊重原创,转载请注明来自:http://www.cnblogs.com/fsjohnhuang/p/6843528.html _肥仔John
前端魔法堂:onsubmit和submit事件处理函数怎么不生效呢?的更多相关文章
- 前端魔法堂:可能是你见过最详细的WebWorker实用指南
前言 JavaScript从使用开初就一直基于事件循环的单线程运行模型,即使是成功进军后端开发的Nodejs也没有改变这一模型.那么对于计算密集型的应用,我们必须创建新进程来执行运算,然后执行进程间通 ...
- 前端魔法堂:解秘FOUC
前言 对于问题多多的IE678,FOUC(flash of unstyled content)--浏览器样式闪烁是一个不可忽视的话题,但对于ever green的浏览器就不用理会了吗?下面尝试较全面 ...
- 前端魔法堂:屏蔽Backspace导致页面回退
前言 前几天用户反映在录入资料时一不小心错按Backspace键,就会直接回退到是一个页面,导致之前辛辛苦苦录入的资料全部丢失了.哦?居然还有这种情况.下面我们来一起探讨一下吧! Windows系统 ...
- CSS魔法堂:更丰富的前端动效by CSS Animation
前言 在<CSS魔法堂:Transition就这么好玩>中我们了解到对于简单的补间动画,我们可以通过transition实现.那到底多简单的动画适合用transtion来实现呢?答案就是 ...
- JS魔法堂:函数节流(throttle)与函数去抖(debounce)
一.前言 以下场景往往由于事件频繁被触发,因而频繁执行DOM操作.资源加载等重行为,导致UI停顿甚至浏览器崩溃. 1. window对象的resize.scroll事件 2. 拖拽时的mousemov ...
- JS魔法堂:不完全国际化&本地化手册 之 实战篇
前言 最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求--国际化&本地化.熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"的阶段而已. ...
- WebComponent魔法堂:深究Custom Element 之 面向痛点编程
前言 最近加入到新项目组负责前端技术预研和选型,一直偏向于以Polymer为代表的WebComponent技术线,于是查阅各类资料想说服老大向这方面靠,最后得到的结果是:"资料99%是英语 ...
- JS魔法堂:IMG元素加载行为详解
一.前言 在<JS魔法堂:jsDeferred源码剖析>中我们了解到img元素加载失败可以作为函数异步执行的优化方案,本文打算对img元素的加载行为进行更深入的探讨. 二.资源加载的相关属 ...
- JS魔法堂:jsDeferred源码剖析
一.前言 最近在研究Promises/A+规范及实现,而Promise/A+规范的制定则很大程度地参考了由日本geek cho45发起的jsDeferred项目(<JavaScript框架设计& ...
随机推荐
- vue学习笔记 模板语法(三)
<div id="kk"> <div>直接输出文本:{{msg}}</div> <div>自定义过滤器输出文本:{{msg|capi ...
- MyBatis快速入门(1):搭建环境和单表映射
一.MyBatis简介 一说起对象关系映射框架,大家第一时间想到的肯定是Hibernate.Hibernate作为一个著名的框架,功能十分强大.我们只需要配置好实体类和数据表之间的关系,Hibe ...
- EventBus通信小能手
1.EventBus简介 EventBus 是由 greenrobot 组织开发的一个 Android 事件发布/订阅轻量级框架,特点:代码简洁,是一种发布订阅设计模式(观察者设计模式). Even ...
- SERVLET中的doGet与doPost两个方法之间的区别
get和post是http协议的两种方法,另外还有head, delete等 这两种方法有本质的区别,get只有一个流,参数附加在url后,大小个数有严格限制且只能是字符串.post的参数是通过另外的 ...
- Unix环境编程基础下
Unix出错处理 当UNIX系统的函数出错时,通常会返回一个负值.我们判断函数的返回值小于0表示出错了,注意我们并不知道为什么出错.例如我们open一个文件,返回值-1表示打开失败,但是为什么打开失败 ...
- 手机自动化测试:appium源码分析之bootstrap十二
手机自动化测试:appium源码分析之bootstrap十二 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣 ...
- Java并发编程:Semaphore、CountDownLatch、CyclicBarrier
首先我们来实现一个功能:当我们启动一个系统的时候需要初始化许多数据,这时候我们可能需要启动很多线程来进行数据的初始化,只有这些系统初始化结束之后才能够启动系统.其实在Java的类库中已经提供了Sema ...
- 请不要把‘通知的观察者注册’放在-viewWillAppear:中
接手项目二次开发的吐槽: 接手别人的代码的悲哀之一就是,我反复的把流程走了一遍又一遍,却始终无法发现原来是这个问题. 之前这个人把通知的观察者注册放在了-viewWillAppear:中,导致,我发送 ...
- JAVA加密算法系列-AES
package ***; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; ...
- 奇葩问题:同样的字符串equal为false
问题:什么情况下 "同样" 的字符串会不equal呢?例如 "a".equal("a") => false 在你看来,这可能是个 ...