Form表单 回车键 防止未校验直接提交

本文探讨了表单中直接通过回车键提交的问题,并提供了解决方案,包括使用onsubmit属性和添加隐藏输入框的方法。
最近做的项目一直有这样的一个场景: 
一个表单里面里有输入框 要你输入值 然后点击一个按钮 校验输入的值是否合法 是否满足。。。某某条件等等校验规则 都满足了 我们就提交后台了。然而不经意间发现一个问题 某个页面 如下 在输入框里点击回车竟然直接提交了页面 绕过了我层层的校验 我的程序就 错了。

一、打开记事本 写下如下代码

<script>
        function check(){
       }
</script>
<form action="#" method="post">
    <input type="text" />
    <input type="button" value="提交" onclick="check()"></input>
</form>

打开页面,当你在输入框内按下回车 想想会发生什么 没错他提交了而且如果有校验也没用

二.怎么解决呢
常用方法:当然是在form上添加onsubmit 属性了
<

script>
    function check(){
        return false;
    }
</script>
<form action="#" method="post" onsubmit="return check();">
    <input type="text" />
</form>

偶然发现:不过我这块有个页面超复杂用onsubmit 感觉逻辑处理起来太烦锁而且易出错
所以 我就禁止了他的回车提交表单(在谷歌下测试好使。。。其他的懒得测试了)。
代码敬上:

<form action="#" method="post">
    <input type="text" />
    <input type="text" style="display:none"/>
</form>

type 必须是text 若一个form里面本来就有多个text的input就不用加这个了
(意思就是 表单里面必须有两个或以上 的text才能阻止enter事件)

补充(2016/03/07):今天又发现一个雷同的问题 表单里面有很多被div包裹的input输入框 按钮是
<button onclick="check()"></button> 不是 <input type="button" onclick="check()"/> 点击按钮 其实js中的提交表单没走 表单也提交了,直接把button 换成 input type=”button”吧 这样的问题很奇怪 也不知道为什么。

function check(){
    if(false){
        form.subbmit();//提交表单
   }
}
<think>嗯,用户问的是如何用JavaScript控制HTML表单提交,并需要示例。首先,我需要回忆一下表单提交的基本机制。通常,表单提交可以通过点击提交按钮或者按回车键触发,默认行为会导致页面刷新,这可能是用户想要的。所以用户可能想阻止默认提交,改用AJAX或者其他处理方式。 接下来,我应该考虑同的方法。比如,使用onsubmit事件处理函数,或者给提交按钮添加点击事件。记得要阻止默认行为,可以用event.preventDefault()。然后,需要验证表单数据,可能涉及到获取各个输入字段的值,检查是否为空、格式是否正确等。这部分可能需要正则表达式,比如邮箱验证。 然后,用户可能需要示例代码。我应该给出一个简单的HTML表单结构,然后展示如何用JavaScript拦截提交,进行验证,最后用AJAX发送数据。同时,要提到现代浏览器可能支持Fetch API,或者传统的XMLHttpRequest。另外,动态绑定事件处理程序也是个好点,可以提到addEventListener,这样比内联的on属性更灵活。 还要考虑兼容性问题吗?比如,旧版IE可能支持preventDefault(),但大多数现代浏览器没问题。过用户可能更关心主流用法,所以可以忽略太老的浏览器。 另外,是否需要提到表单校验的HTML5属性,比如required、pattern?虽然有用,但用户的问题明确要求JavaScript控制,所以可能需要深入,但可以稍微提及作为补充。 可能用户的实际需求是防止重复提交,或者异步提交数据,比如单页应用。所以示例中最好包括如何处理成功和错误的响应,比如用.then和.catch处理Fetch返回的Promise。 最后,相关问题部分需要生成几个相关的延伸问题。比如,如何防止重复提交表单验证的其他方法,或者如何用jQuery简化操作。这些能帮助用户进一步探索。</think># JavaScript控制HTML表单提交的方法与示例 ## 一、基础控制方法 1. 通过`onsubmit`事件拦截表单提交 ```html <form id="myForm" onsubmit="return validateForm()"> <input type="text" name="username" required> <button type="submit">提交</button> </form> <script> function validateForm() { const username = document.forms["myForm"]["username"].value; if (username === "") { alert("用户名能为空"); return false; // 阻止表单提交 } return true; // 允许提交 } </script> ``` 此方法会先执行验证逻辑再决定是否提交表单[^1] 2. 使用`addEventListener`动态绑定 ```javascript document.getElementById("myForm").addEventListener("submit", function(e) { e.preventDefault(); // 阻止默认提交行为 // 自定义处理逻辑 console.log("表单已拦截,准备异步提交"); submitFormAsync(this); }); ``` ## 二、进阶控制技巧 1. AJAX异步提交(Fetch API示例) ```javascript async function submitFormAsync(form) { const formData = new FormData(form); try { const response = await fetch("/submit", { method: "POST", body: formData }); if (!response.ok) throw new Error("网络响应异常"); const result = await response.json(); console.log("提交成功:", result); } catch (error) { console.error("提交失败:", error); } } ``` 2. 动态表单验证 ```javascript function validateEmail(email) { const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return re.test(String(email).toLowerCase()); } document.querySelector("#email").addEventListener("blur", function() { if (!validateEmail(this.value)) { this.classList.add("error"); this.nextElementSibling.textContent = "邮箱格式正确"; } }); ``` ## 三、最佳实践建议 1. 组合使用HTML5验证属性与JavaScript验证 ```html <input type="email" name="email" required pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$"> ``` 2. 防止重复提交方案 ```javascript let isSubmitting = false; form.addEventListener("submit", async (e) => { if (isSubmitting) return; isSubmitting = true; submitBtn.disabled = true; submitBtn.textContent = "提交中..."; try { await submitFormAsync(form); } finally { isSubmitting = false; submitBtn.disabled = false; submitBtn.textContent = "提交"; } }); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值