多重提交表单的校验方法

博客介绍了将页面表单提交到不同页面的处理方法,即通过onClick事件动态给出action值。但针对不同提交目标的表单校验放在onClick事件中会导致无论是否通过验证都会提交表单的问题,作者给出了相应的解决办法。

 

有时我们需把一个页面的表单提交到不同的页面,处理方法一般采用在onClick事件中动态给出action的值,如下例:

<FORM ACTION="" METHOD="post" NAME="PostTopic">

 <INPUT TYPE="submit" NAME=Submit VALUE="新增" class=buttonface onclick="document.PostTopic.action='addone.php';">
    <INPUT TYPE="RESET" NAME=Reset VALUE="重置" class=buttonface >
    <INPUT TYPE="submit" NAME="Submit" VALUE="修改" class=buttonface onclick="document.PostTopic.action='modify.php';">
</FORM>   

此时针对不同提交目标对表单作的校验,只能放在onClick事件中,但这样造成无论是否通过验证都会提交表单的问题。因为这个按钮是submit类型。

对此问题,我的解决方法是这样的:

<script language="JavaScript">
<!--

document.returnValue=true; //一个全局变量,给初值。

function validateForm() {
  var errors;
  errors='';
  if (document.PostTopic.title.value=="")
   errors="标题不能为空";
  if( document.PostTopic.intro.value.length>10)
    errors+="/n简介不能多于10个字";
  if (errors!='') alert(errors);
  document.returnValue = (errors == '');
}

file://-->
</script>

<FORM ACTION="" METHOD="post" NAME="PostTopic" onSubmit="return document.returnValue;">
<input type=text name=title value="">
<input type=text name=intro value="">
<INPUT TYPE="submit" NAME=Submit VALUE="新增" class=buttonface onclick="document.PostTopic.action='addone.php';validateForm(); return document.returnValue;">
      <INPUT TYPE="RESET" NAME=Reset VALUE="重置" class=buttonface >
      <INPUT TYPE="submit" NAME="Submit" VALUE="修改" class=buttonface onclick="document.PostTopic.action='modify.php';validateForm(); return document.returnValue;">
</FORM>

### 可能的原因分析 `el-form` 表单提交时触发多次的问题通常由以下几个原因引起: 1. **重复绑定事件** 如果在代码中多次绑定了 `submit` 或其他相关事件,则可能导致表单提交被多次触发。例如,在 Vue 的生命周期钩子函数(如 `mounted`)中反复调用相同的事件监听器。 2. **父组件中的默认行为未阻止** 当点击按钮时,如果没有正确阻止浏览器的默认行为(即 `<button>` 默认会尝试提交表单),可能会导致额外的提交操作发生。 3. **嵌套表单结构错误** 如引用[1]所描述的情况,如果 `el-form-item` 被意外放置到 `el-form` 外部或者存在不合理的嵌套关系,也可能引发异常的行为,包括多次触发提交事件[^1]。 4. **异步校验逻辑冲突** 使用 `validateField` 方法或其他自定义校验机制时,如果不当处理回调或 Promise 结果,可能造成多个验证流程并行运行,从而间接导致多次提交现象[^3]。 --- ### 解决方案 以下是针对上述问题的具体解决办法: #### 1. 防止重复绑定事件 确保只在一个地方注册了表单提交的相关事件处理器。可以通过调试工具检查是否存在多余的事件监听器,并移除冗余部分。 #### 2. 阻止默认行为 对于 HTML 中的 `<form>` 和 `<button type="submit">` 元素,默认情况下它们都会试图执行页面刷新动作。因此建议显式地通过 JavaScript 来拦截这种行为: ```javascript methods: { handleSubmit(event) { event.preventDefault(); // 阻止默认提交行为 this.$refs['ruleForm'].validate((valid) => { if (valid) { alert('Submit success!'); } else { console.log('Error submit!!'); return false; } }); } } ``` #### 3. 正确配置表单项位置 重新审视整个模板布局,确认所有的 `el-form-item` 组件都位于其对应的 `el-form` 容器内部。这一步骤可以有效避免由于 DOM 层次混乱而导致的功能失效情况。 #### 4. 合理运用校验方法 采用 Element UI 自带的 `validateField` 函数单独检验某些字段之前,请务必等待先前发起的所有请求完成后再继续下一步操作。这样能够减少不必要的并发干扰: ```javascript this.$refs['ruleForm'].validateField(['fieldA', 'fieldB'], () => {}); // 上述语法表示同时对 fieldA 和 fieldB 进行局部检测 ``` 另外需要注意的是,虽然 `change` 是常用的触发表单校验方式之一,但并非唯一途径。依据具体业务场景的不同,还可以考虑利用诸如 `input`, `blur` 等其它类型的事件来进行动态监控与即时反馈[^2]。 --- ### 总结 综上所述,要彻底根治 `el-form` 提交过程中出现的多重响应难题,需从根源出发逐一排查潜在隐患点——无论是前端框架本身的设置失误还是外部因素的影响均不可忽视。只有做到精准定位问题所在才能制定出切实可行的有效对策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值