应该是jQuery的$(form).submit();不在表单标签内触发onSubmit?

时间:2009-03-14 06:51:36

标签: jquery onsubmit

我有以下内容:

<script type="text/javascript">
function CancelFormButton(button) {
    $(button.form).submit();
}
</script>

<form onsubmit="alert('here');">
<input type="button" value="Cancel" onClick="CancelFormButton(this);" />
</form>

单击“取消”按钮时,不会触发表单标记中的onsubmit。

这一行改为成功提交表单:$(button.form).submit();但跳过表单标记中onsubmit中的alert('here');

这是正确的还是我做错了什么?

顺便说一句,在这种情况下,我想要这个功能,但我只是想知道我是否会在触发onsubmit的浏览器中遇到问题。

9 个答案:

答案 0 :(得分:50)

抱歉,误解了你的问题。

根据Javascript - capturing onsubmit when calling form.submit()

  我最近被问到:“为什么不这样做   form.onsubmit事件被我解雇了   使用javascript提交表单?“

     

答案:目前的浏览器没有   坚持这部分的HTML   规格。该事件只会触发   当它被用户激活时 - 和   激活时不会触发   代码。

(重点补充)。

注意:“由用户激活”还包括点击提交按钮(可能包括输入键的默认提交行为,但我没有尝试过)。我相信,如果您(使用代码)单击提交按钮,它也会被触发。

答案 1 :(得分:25)

This解决问题将解决@Cletus发现的问题。

function submitForm(form) {
    //get the form element's document to create the input control with
    //(this way will work across windows in IE8)
    var button = form.ownerDocument.createElement('input');
    //make sure it can't be seen/disrupts layout (even momentarily)
    button.style.display = 'none';
    //make it such that it will invoke submit if clicked
    button.type = 'submit';
    //append it and click it
    form.appendChild(button).click();
    //if it was prevented, make sure we don't get a build up of buttons
    form.removeChild(button);
}

适用于所有现代浏览器。
将在标签/衍生的子窗口上工作(是的,即使在IE&lt; 9中)。
并且是在香草!

只需将一个DOM引用传递给表单元素,它就会确保所有附加的侦听器,onsubmit和(如果当时没有阻止)最终提交表单。

答案 2 :(得分:6)

我的简单解决方案:

$("form").children('input[type="submit"]').click();

这对我有用。

答案 3 :(得分:6)

我认为在某些情况下想要这种行为是合理的,但我认为不触发表单提交的代码应该(始终)是默认行为。假设您想要使用

捕获表单的提交
$("form").submit(function(e){
    e.preventDefault();
});

然后对输入进行一些验证。如果代码可以触发提交处理程序,则永远不能包含

$("form").submit()

在此处理程序中,因为它会导致无限循环(将调用SAME处理程序,阻止提交,验证和重新提交)。您需要能够在提交处理程序内手动提交表单,而不会触发相同的处理程序。

我意识到这并没有直接回答这个问题,但是在这个页面上还有很多关于如何破解这个功能的其他答案,我觉得这需要指出(而且评论太长了) )。

答案 4 :(得分:1)

尝试在函数中触发()事件:

$("form").trigger('submit'); // and then... do submit()

答案 5 :(得分:1)

而不是

$("<input type='submit' id='btn_tmpSubmit'/>").css('display','none').appendTo('form'); $("#btn_tmpSubmit").click();

试试这个

$ docker pull ubuntu:14.04
$ docker run -ti ubuntu:14.04
root@8f0dcfdae9b6:/# apt-get update

答案 6 :(得分:1)

trigger('submit')不起作用.beacuse onSubmit方法不会被触发。 以下代码适用于我,使用此代码时调用onSubmit方法:

$("form").find(':submit').click();

答案 7 :(得分:0)

几年前我发现了这个问题。

最近我试图“重写”提交方法。下面是我的代码

window.onload= function (){
for(var i= 0;i<document.forms.length;i++){
    (function (p){
        var form= document.forms[i];
        var originFn= form.submit;
        form.submit=function (){
            //do something you like
            alert("submitting "+form.id+" using submit method !");
            originFn();
        }
        form.onsubmit= function (){
            alert("submitting "+form.id+" with onsubmit event !");
        }
    })(i);


}

}

<form method="get" action="" id="form1">
<input type="submit" value="提交form1" />
<input type="button" name="" id="" value="button模拟提交1" onclick="document.forms[0].submit();" /></form>

它在IE中完成,但在其他浏览器中失败的原因与“cletus”相同

答案 8 :(得分:0)

解决此问题的最简单方法是使用提交类型和触发器点击创建“临时”输入:

var submitInput = $("<input type='submit' />");
$("#aspnetForm").append(submitInput);
submitInput.trigger("click");