前端魔法堂:onsubmit和submit事件处理函数怎么不生效呢?

简介: 最近在用Polymer增强form,使其支持表单的异步提交,但发现明明订阅了onsubmit和submit事件,却怎么也触发不了。下面我们将一一道来。

前言

 最近在用Polymer增强form,使其支持表单的异步提交,但发现明明订阅了onsubmit和submit事件,却怎么也触发不了。下面我们将一一道来。

提交表单的方式

  1. 表单仅含一个以下的元素时,该元素得到焦点,按回车键,即可发起表单提交。
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>
  1. 表单含两个或以上的上述元素时,在表单中添加一个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>
  1. 通过调用表单元素的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>
  1. 通过触发表单的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. 方式1,方式2和方式4均可依次调用onsubmit函数和触发submit事件,因此可以在onsubmit函数或submit事件处理函数中禁止执行默认行为来实现表单的异步提交;
  2. 方式3既不会调用onsubmit函数,也不会触发submit事件。

还有HTML5表单合法性验证呢!

 HTML5对表单作了增强,其中最耀眼的可谓是合法性验证这一部分。首先我们要明确一点的是,验证发生在与input等表单控件发生交互时(输入,点击,脚本修改其值等),而不是提交表单时才触发验证。然后再根据表单的配置和触发表单提交的方式,决定合法性验证的结果是否会阻止表单的提交。

前提:form.novalidate为false

<form>
    <input type="text" id="name" name="name" required>
</form>
  1. 方式1和方式2,若input#name内容为空,则弹出非法内容警告,并阻止表单提交,不执行onsubmit和触发submit事件
  2. 方式3,直接提交表单
  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

目录
相关文章
|
3月前
|
前端开发 JavaScript 开发者
揭秘JavaScript魔法三剑客:call、apply、bind,解锁函数新世界,你的前端之路因它们而精彩!
【8月更文挑战第23天】在 JavaScript 的世界里,`call`、`apply` 和 `bind` 这三个方法常常让新手感到困惑。它们都能改变函数执行时的上下文(即 `this` 的指向),但各有特点:`call` 接受一系列参数并直接调用函数;`apply` 则接收一个参数数组,在处理不确定数量的参数时特别有用;而 `bind` 不会立即执行函数,而是创建一个新版本的函数,其 `this` 上下文已被永久绑定。理解这三个方法能帮助开发者更好地运用函数式编程技巧,提升代码灵活性和可维护性。
37 0
|
24天前
|
前端开发 JavaScript
前端:实现一个 sleep 函数
在前端开发中,实现一个 `sleep` 函数可以用来暂停代码执行,模拟延迟效果,常用于测试或控制异步操作的节奏。该函数通常基于 `Promise` 和 `setTimeout` 实现,简单易用。
|
2月前
|
存储 前端开发 JavaScript
前端基础(十二)_函数高级、全局变量和局部变量、 预解析(变量提升)、函数返回值
本文介绍了JavaScript中作用域的概念,包括全局变量和局部变量的区别,预解析机制(变量提升),以及函数返回值的使用和类型。通过具体示例讲解了变量的作用域、函数的返回值、以及如何通过return关键字从函数中返回数据。
22 1
前端基础(十二)_函数高级、全局变量和局部变量、 预解析(变量提升)、函数返回值
|
2月前
|
存储 前端开发 JavaScript
前端基础(十一)_函数声明及调用、函数的形参与实参、arguments参数、函数的参数类型、函数中的问题
本文介绍了JavaScript中函数的声明及调用、形参与实参的概念、arguments对象的使用、函数参数的类型以及函数中this的作用。通过示例代码详细解释了函数如何接收参数、如何处理参数个数不匹配的情况,以及函数在不同上下文中this的指向。
22 1
|
3月前
|
JSON 前端开发 API
构建前端防腐策略问题之更新getMemoryUsagePercent函数以适应新的API返回格式的问题如何解决
构建前端防腐策略问题之更新getMemoryUsagePercent函数以适应新的API返回格式的问题如何解决
构建前端防腐策略问题之更新getMemoryUsagePercent函数以适应新的API返回格式的问题如何解决
|
2月前
|
JavaScript 前端开发
前端JS函数
【9月更文挑战第4天】前端JS函数
26 6
|
4月前
|
开发框架 前端开发 JavaScript
在微信框架模块中,基于Vue&Element前端的事件和内容的管理
在微信框架模块中,基于Vue&Element前端的事件和内容的管理
|
3月前
|
前端开发 JavaScript 开发者
掌握Web前端事件处理精髓:从事件冒泡到事件委托,轻松优化你的交互体验与代码性能!
【8月更文挑战第23天】在Web前端开发中,事件处理是实现用户交互的关键机制。其中,事件冒泡与事件委托是优化页面性能、简化代码的重要手段。事件冒泡是指事件从触发它的元素开始,沿着DOM树向上逐层传播至根节点的过程。通过阻止事件冒泡,可以控制事件的影响范围。而事件委托则是利用事件冒泡特性,在父元素上设置监听器来响应子元素的事件,这种方法减少了监听器的设置数量,特别适用于动态添加的子元素,提高了代码的可维护性和性能。掌握这两种技术,能帮助开发者构建更高效、更简洁的应用程序。
50 0
|
22天前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
100 2
|
22天前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
34 0