以前没发现 form 表单这个特性

2022-02-22 13:58:32 +08:00
 waiaan
<form>
    <input type="button" onclick="submit()" value="提交"/>
</form>

在 html 里写如上代码,未定义任何 submit 方法,点击按钮后 form 表单会直接提交。 如果覆写 form 元素自带的 submit 方法

HTMLFormElement.prototype.submit=function(){console.log(123)}

此时点击按钮后 form 表单不再提交,控制台打印出 123 。 chrome 、ff 、edge 会如此,ie11 不会,这是浏览器新功能还是规范里规定的?

2649 次点击
所在节点    前端开发
32 条回复
waiaan
2022-02-22 14:59:29 +08:00
codehz
2022-02-22 15:00:07 +08:00
@3dwelcome 问题在于,你 onsubmit 如果改成一个返回 truthy 指(也就是可以转换成 true 的表达式),原本的 submit 依旧会被执行( console.log 刚好返回 undefined ,所以会自动阻止原本 submit 方法的执行(
foolnius
2022-02-22 15:01:57 +08:00
https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLFormElement
HTMLFormElement 不就包括了 submit()方法吗? IE5.5 都兼容
codehz
2022-02-22 15:03:30 +08:00
@waiaan 并不是,对于任意通过 onXXX 绑定的事件处理函数都有类似 with 的处理逻辑(不在 form 章节里,但是 html spec 太长了,不是很想找。。。),显然你这里用的是 oninput
waiaan
2022-02-22 15:08:55 +08:00
@codehz
打断点看了一下,确实如您所言。
lawler
2022-02-22 15:14:41 +08:00
formObject.submit() 是原生 JS 默认实现,所有浏览器都支持,包括 IE ,你测试 IE 不支持,不确定是什么问题。古老的代码中,经常会看到 onclick=return false ,就是为了屏蔽默认实现。而你 input 的 onclick 调用了 from 的默认实现。
codehz
2022-02-22 15:18:54 +08:00
@3dwelcome 说错了,submit 方法的默认行为是触发 submit 事件,然后根据是否 preventDefault 来决定是否执行提交行为,而 onXXX 事件绑定机制是当返回 falsy 值时 preventDefault ,因此当你同时定义 onsubmit 和 submit 方法时,两者将独立工作互不影响((通过 type=submit 按钮触发的会发送 submit 事件,然后如果没被 preventDefault 就执行原生提交程序(与 submit 函数无关);而通过 submit 方法手动调用的就会进入你自定义的函数上,也不会触发事件(除非你手动 dispatchEvent )
waiaan
2022-02-22 15:21:28 +08:00
@codehz
@lawler
试了一下,自己定义一个名为 submit 的函数也没法在 onclick="submit()"里调用到了,它还是调用 form 的方法,reset 方法也是。
codehz
2022-02-22 15:23:03 +08:00
@waiaan 因为 with 最内侧的优先级最高,先找到的就调用了,全局函数是最外面的
Rache1
2022-02-22 15:24:27 +08:00
😂 一会儿你还会发现有个 reset() 方法,也可以玩。
waiaan
2022-02-22 15:24:57 +08:00
@codehz
非常感谢!
jifengg
2022-02-22 15:30:36 +08:00
@codehz 解释很棒!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/835643

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX