一键提交两份表格

IT技术 javascript html forms
2021-02-01 20:19:37

我有两种 HTML 表单,一种在使用 PHP 输入数据库时​​提交数据,另一种将用户引导至paypal付款页面,我的问题是用户必须同时提交这两种形式,我当然不希望他们这样做得做。有没有办法为两个表单使用一个提交按钮?

(欢迎使用 JavaScript)

6个回答

你应该可以用 JavaScript 做到这一点:

<input type="button" value="Click Me!" onclick="submitForms()" />

如果您的表单有 ID:

submitForms = function(){
    document.getElementById("form1").submit();
    document.getElementById("form2").submit();
}

如果您的表单没有 ID 但有名称:

submitForms = function(){
    document.forms["form1"].submit();
    document.forms["form2"].submit();
}
跟时间有关系吗?在提交之间设置一个短暂的超时可能会解决这个问题吗?
2021-03-11 20:19:37
喜欢支付网站?
2021-03-22 20:19:37
请原谅我的编辑,但我想收回我的反对票。我不确定请求会发生什么。请求肯定会被浏览器中止,但它可能仍会一直传递到服务器。我尝试使用您的技术调试我的本地服务器,并且确实调用了两个页面,所以也许您的方式工作正常。
2021-03-26 20:19:37
嗨,我正在关注这个,它只提交 javascript 函数中的最后一个表单。你知道那是什么错误吗?
2021-04-01 20:19:37
这是完全错误的(至少对于 Chrome 和 IE9)!请看我下面的回答。
2021-04-04 20:19:37

表单提交会导致页面导航到action表单的 。因此,您不能以传统方式同时提交两种表格。如果您尝试使用 JavaScript 通过form.submit()连续调用每个表单来执行此操作,则除了最后一次提交之外,每个请求都将被中止。因此,您需要通过 JavaScript 异步提交第一个表单:

var f = document.forms.updateDB;
var postData = [];
for (var i = 0; i < f.elements.length; i++) {
    postData.push(f.elements[i].name + "=" + f.elements[i].value);
}
var xhr = new XMLHttpRequest();
xhr.open("POST", "mypage.php", true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send(postData.join("&"));

document.forms.payPal.submit();
在 xhr 对象完成之前,不应提交第二个表单。
2021-03-29 20:19:37
很好的答案,但根据情况和表单的提交方式,第一个的提交可能会阻止第二个的提交(例如,在一个表单上使用 submit 事件调用submit()另一个将仅在 Firefox 中提交第一个)。
2021-04-07 20:19:37

您可以使用 AJAX 提交第一个表单,否则提交一个将阻止另一个提交。

在 Chrome 和 IE9(我猜所有其他浏览器也是如此)中,只有后者会生成套接字连接,第一个将被丢弃。(浏览器会检测到这一点,因为这两个请求都是在上面代码中的一个 JavaScript“时间片”内发送的,并丢弃除最后一个请求之外的所有请求。)

如果你有一些事件回调做第二次提交(但在收到回复之前),第一个请求的套接字将被取消。绝对没有什么值得推荐的,因为在这种情况下服务器可能已经处理了您的第一个请求,但您永远不会确定。

我建议您使用/生成一个可以在服务器端进行交易的请求。

使用Promise或延迟对象也是一种有value的选择。
2021-04-09 20:19:37

当前选择的最佳答案过于模糊,不可靠。

这对我来说是一种相当安全的方法:

(Javascript:使用 jQuery 写得更简单)

$('#form1').submit(doubleSubmit);

function doubleSubmit(e1) {
    e1.preventDefault();
    e1.stopPropagation();
    var post_form1 = $.post($(this).action, $(this).serialize());

    post_form1.done(function(result) {
            // would be nice to show some feedback about the first result here
            $('#form2').submit();
        });
};

发布第一个表单而不更改页面,等待该过程完成。然后发布第二个表格。第二个帖子将更改页面,但您可能希望为第二个表单也有一些类似的代码,以获得第二个延迟对象(post_form2?)。

不过,我没有测试代码。

为什么要投反对票?如果我写错了什么,评论会更好。
2021-03-25 20:19:37
@dev_khan 他们提供不同的功能,所以,不,他们中的任何一个都不够。preventDefault肯定需要,以防止默认提交并掌握该事件将发生的事情。stopPropagation相反,取决于用例,以防事件不应该从外部元素中捕获(不记得了,但可能去年我把它- 在动态编码-只是为了安全😉)。别担心,我认为你没有投反对票(为什么我得到它仍然是个谜),但感谢你指定它😊
2021-03-25 20:19:37
为什么你同时使用e1.preventDefault();e1.stopPropagation();我想他们中的任何一个都足够了。仅供参考,我没有投反对票。只是我到达此页面并有一些疑问。
2021-04-03 20:19:37