【问题标题】:How do I automatically submit two forms without the page refreshing?如何在不刷新页面的情况下自动提交两个表单?
【发布时间】:2022-10-02 00:03:28
【问题描述】:
 <form id=\"addToCart\" action=\"http://my-website/cart/action.php\">
   <input type=\"hidden\" name=\"action\" value=\"add\" />
   <input type=\"hidden\" name=\"itemNum\" value=\"201\" />
   <input type=\"submit\" value=\"Submit request\" />
 </form>

 <form id=\"buy\" action=\"http://my-website/cart/action.php?action=buy\" method=\"POST\">
   <input type=\"submit\" value=\"Submit request\" />
 </form>

 <script> 
    document.forms[0].submit();
    document.forms[1].submit();
 </script>
 

这只会提交第一个表单,而不是第二个。我怎样才能让它同时提交?

在有人问之前,我也在下面尝试了这个,但它仍然没有用。

document.getElementById(\"addToCart\").submit(); document.getElementById(\"buy\").submit();

    标签: javascript html jquery http https


    【解决方案1】:

    按优先顺序

    1. 提交所有数据以执行操作,然后添加并购买
    2. 使用ajax,在第一次提交成功后提交第二个表单
      const url = "https://my-website/cart/action.php";
      document.getElementById("container").addEventListener("click", e => {
        const itemNum = e.target.dataset.itemnum;
        fetch(url, {
            method: "post",
            headers: {
              'Accept': 'application/json',
              'Content-Type': 'application/json'
            },
      
            //make sure to serialize your JSON body
            body: JSON.stringify({
              action: "add",
              itemNum: itemNum
            })
          })
          .then(() => {
            fetch(url, {
              method: "post",
              headers: {
                'Accept': 'application/json',
                'Content-Type': 'application/json'
              },
      
              //make sure to serialize your JSON body
              body: JSON.stringify({
                action: "buy",
                itemNum: itemNum
              })
            })
          })
      });
      
      <div id="container">
        <input type="button" data-itemnum="201" value="Buy 201 with one click " />
        <input type="button" data-itemnum="202" value="Buy 202 with one click " />
        <input type="button" data-itemnum="203" value="Buy 203 with one click " />
      </div>
      
      1. 两个 iframe(不要更改字段或方法,只更改操作的值):
       <form id="addToCart" method="post" action="http://my-website/cart/action.php" target="iframe1">
         <input type="hidden" name="action" value="add" />
         <input type="hidden" name="itemNum" value="201" />
         <input type="submit" value="Submit request" />
       </form>
      
       <form id="buy" action="http://my-website/cart/action.php" method="POST"  target="iframe2">>
         <input type="hidden" name="action" value="buy" />
         <input type="hidden" name="itemNum" value="201" />
         <input type="submit" value="Submit request" />
       </form>
      <iframe name="iframe1"></iframe>
      <iframe name="iframe2"></iframe>
       <script> 
          document.forms[0].submit();
          setTimeout(() => document.forms[1].submit(),2000);
       </script>
       
      

    【讨论】:

    • 您给出的示例在页面上创建了两个 iframe,并有两个提交按钮。然而,没有提交的表格。
    • 您能否举例说明如何使用 ajax 执行此操作,因为 iframe 示例不起作用?
    • 不行怎么办?控制台中的错误?
    • 我强烈建议您的 action.php,可以使用 ONE action 添加和购买
    • 没有错误。它只显示带有 iframe 的页面,但不提交任何内容。我将尝试您更新的代码,并让您知道它是否有效。谢谢你。
    【解决方案2】:

    这将是我的方法。使用 jquery ajax 为每个表单定义一个.submit() 函数(提交时遵循的过程)。使用.click() 以编程方式“单击”两个提交按钮。然后使用return false 防止页面刷新。这应该同时提交两个表格。如果没有 php 操作,我无法对此进行测试。

    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <form id="addToCart" action="http://my-website/cart/action.php" method="get">
        <input type="hidden" name="action" value="add" />
        <input type="hidden" name="itemNum" value="201" />
        <input type="submit" value="Submit request" />
    </form>
    
    <form id="buy" action="http://my-website/cart/action.php?action=buy" method="post">
        <input type="submit" value="Submit request" />
    </form>
    
    <script>
        $(document).ready(function() {
            const $addToCartForm = $("#addToCart");
            const $buyForm = $("#buy");
            const addToCartUrl = $("#addToCart").attr("action");
            const buyUrl = $("#buy").attr("action");
            $buyForm.submit(function() {
                $.ajax({
                    url: buyUrl,
                    type: $buyForm.attr("method"),
                    data: $buyForm.serialize()
                });
                return false;
            });
            $addToCartForm.submit(function() {
                $.ajax({
                    url: buyUrl,
                    type: $addToCartForm.attr("method"),
                    data: $addToCartForm.serialize()
                });
                return false;
            });
    
            $addToCartForm.find("[type='submit']").click();
            $buyForm.find("[type='submit']").click();
        });
    </script>
    

    【讨论】:

    • 非常简洁的解决方案,除了应该首先执行添加到购物车并且它是 GET 请求而不是 POST 请求,但这很容易改变。这两个表单已提交,但唯一的问题是由于 CORS(跨域资源共享)而出现错误 303。
    • 我进行了编辑。另外,我不确定您拥有什么样的环境,但 CORS 错误似乎是另一个问题。您可以查看此链接stackoverflow.com/questions/28701921/…
    【解决方案3】:

    您可以使用 AJAX 和 JQuery $.post() 方法同时提交两个表单。

    $(document).ready(main);
    
    function main(){
        submitFormUsingAjax('#addToCart');
        submitFormUsingAjax('#buy');
    }
    
    function extractInputDataOfFromRef(formSelector){
      var $inputRefs = $(formSelector +' input:not([type=submit])');
      var data = {};
      $inputRefs.each(function($index){
        var name = $(this).attr("name");
        var value = $(this).attr("value");
        data[name] = value;
      })
      return data;
    }
    
    function submitFormUsingAjax(formSelector){
      var $formRef = $(formSelector);
      var url = $formRef.attr('action');
      var data = extractInputDataOfFromRef(formSelector);
      var method = $formRef.attr('method');
      method = method && method.toUpperCase();
      var posting;
      if(method == 'GET'){
         posting = $.get(url,data);
      }else{
        posting = $.post(url,data)
      }
      posting.done(function(response) {
        console.log("form submitted: ",response);
      });
      posting.fail(function(error) {
        console.log("form submittion failed:",error.statusText);
      });
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    
    <form id="addToCart" action="http://my-website/cart/action.php" method="get">
       <input type="hidden" name="action" value="add" />
       <input type="hidden" name="itemNum" value="201" />
       <input type="submit" value="Submit request" />
     </form>
    
     <form id="buy" action="http://my-website/cart/action.php?action=buy" method="POST">
       <input type="submit" value="Submit request" />
     </form>

    【讨论】:

    • 无需加载库。问题未标记 jQuery
    • 这会提交两个表单,但我收到 303 错误。第一种形式是 GET 请求。我认为您的解决方案也尝试对两者都使用 POST。如何将 GET 用于第一个,将 POST 用于第二个?
    • 所以我设法获取第一个表单并发布第二个表单,但我收到 303 CORS 错误。如果我能以某种方式解决这个问题,那么它将起作用。有什么建议么?
    • 我已经修改了代码以检测表单的方法并对其使用适当的请求。当我们尝试从其域与我们的 API 不匹配的备用网站从 AJAX 访问 API 时,就会发生 CORS。要修复 CORS 错误,您应该检查一次后端并允许 CORS 接收来自您网站域的请求。
    【解决方案4】:
    document.forms[0].onsubmit = (e) => {
        e.preventDefault();
    }
    

    【讨论】:

      猜你喜欢
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-12
      • 2019-12-21
      • 2012-07-23
      • 1970-01-01
      • 2019-04-19
      相关资源
      最近更新 更多