form.submit() 将在表单内触发 double

Posted

技术标签:

【中文标题】form.submit() 将在表单内触发 double【英文标题】:form.submit() will trigger double inside a form 【发布时间】:2019-11-09 04:03:27 【问题描述】:

早安,

以下是我的jsp代码:

<s:form beanclass="c.c.i.c.app.profile.ui.ChangePasswordAction" method="post" name="form1">
<!-- some others code here -->
     <sx:row cssClass="button_row">
          <sx:input name="updatePassword" image="submit"/>  
     </sx:row>
</s:form>

这是我的jquery

<script type="text/javascript">
$(':input[name=updatePassword]').click(function() 

        var answerProceed = confirm("Do you wish to proceed with the changes?");

        if( answerProceed )
            var form = $("form[name=form1]");
            form.attr("action", '<s:url beanclass="c.c.i.c.app.profile.ui.ChangePasswordAction" event="update"/>');
            form.submit();
         else 
        return false;
    );
</script>

我们可以看到,在jQuery中,它会触发update事件到ChangePasswordAction

但是,目前我有一个问题,有时会触发2次,并不总是发生,但发生率约为50%。

以下是我从我的应用程序日志中得到的触发日志:

2019-06-26 18:19:13.658 [WebContainer : 31] TRACE o.s.w.c.s.XmlWebApplicationContext - [bmaker] - Publishing event in Root WebApplicationContext: org.springframework.security.event.authorization.AuthorizedEvent[source=FilterInvocation: URL: /common/change_password.html?update=&__stoken=1a47d3a9-29e8-4904-b204-3cb9fc0129f0]
2019-06-26 18:19:13.660 [WebContainer : 26] TRACE o.s.w.c.s.XmlWebApplicationContext - [bmaker] - Publishing event in Root WebApplicationContext: org.springframework.security.event.authorization.AuthorizedEvent[source=FilterInvocation: URL: /common/change_password.html?update=&__stoken=1a47d3a9-29e8-4904-b204-3cb9fc0129f0]

有人知道代码有什么问题吗?

【问题讨论】:

如果您的表单输入类型为提交,如果您想在提交表单之前检查确认,则必须在您的 javascript 中使用preventDefault()。即:...click(function() e.preventDefault(); var answerProceed... 其中e 是隐含的Event 实现参数,如MouseEvent 在您的情况下。 嗨@Paul,很抱歉回复晚了,您可以更新为答案,我会将其标记为我的正确答案。 好吧,我写了答案。一旦答案被接受,我将删除我的 cmets。 @Paul ,可以,你可以在这里留言,也很有用。 【参考方案1】:

如果&lt;input/&gt; 在表单中属于type="submit",如果您想在提交表单之前检查确认,则必须使用preventDefault()。 在这种情况下,您可以将 e 作为参数传递给您的侦听器,作为 Event 实现参数,如 MouseEvent(由于 click 事件)。

例如:

$(':input[name=updatePassword]').click(function(e)  // <-- e implements Event
    e.preventDefault(); // <-- prevent the submit of the form
    var answerProceed = confirm("Do you wish to proceed with the changes?");
    if (answerProceed) 
        var form = $("form[name=form1]");
        // var form = e.currentTarget.form; you can do this
        // var form = this.form; or you can do this, "this" is implicit clicked element
        form.attr("action", '<s:url beanclass="c.c.i.c.app.profile.ui.ChangePasswordAction" event="update"/>');
        form.submit();
    
    else 
        return false;
    
);

您可以通过对元素执行.form 来访问元素的形式,请参阅 HTMLSelectElement.form

Event.preventDefault()

Event

MouseEvent

【讨论】:

以上是关于form.submit() 将在表单内触发 double的主要内容,如果未能解决你的问题,请参考以下文章

jQuery Validate:submitHandler 提交表单而不点击 form.submit

form.submit 方法 并不会触发 form.onsubmit 事件

html自动提交表单

jsp中用button提交表单数据

表单提交时的角度表单错误组件触发验证

等待 form.submit() / POST 完成