使用 preventDefault 功能后有没有办法提交这个表单?

Posted

技术标签:

【中文标题】使用 preventDefault 功能后有没有办法提交这个表单?【英文标题】:Is there a way of submitting this form after using the preventDefault function? 【发布时间】:2021-12-09 15:55:59 【问题描述】:

我正在尝试检查表单中的选择,如果选择的选项是现金,它会提交,否则它会调用 API 并返回成功响应,表单应该继续并提交

我的 Javascipt

document.getElementById('myform').addEventListener('submit', checkPayment);

        function checkPayment(event) 
            var payment = document.getElementById('payment').value;
            var phone = document.getElementById('phone').value;
            if (payment == "Cash") 
                alert("Paying with Cash!");
             else 
                alert("Paying with Mpesa!");
                var valid = false;
                event.preventDefault();
                $.ajax(
                    url: 'payment/MpesaProcessor.php',
                    type: 'POST',
                    data: 
                        'amount': $('#parkingcharge').val(),
                        'phone': $('#phone').val(),
                    ,
                    success: function(text) 
                        console.log(text);
                        if (text == "success") 
                            alert("Click Ok Once Payment Has been Received");
                            event.preventDefault();
                            $('#myform').submit();
                         else 
                            alert("Payment Not Successful")
                        
                    
                );
            
        

【问题讨论】:

使用表单原生的submit方法,不会再次触发验证。 你能解释更多吗@Teemu 更多?你想知道什么?只需在 AJAX success 方法中执行 $('#myform')[0].submit(); 而不是 $('#myform').submit(); 还是没有提交 它是否通过了条件,你看到 OK 警报了吗?请注意,success 中不再存在该事件,请从中删除行 event.preventDefault(); 【参考方案1】:

如果AJAX调用成功,你可以尝试使用全局变量来存储

document.getElementById('myform').addEventListener('submit', checkPayment);

var isSuccess = false;

function checkPayment(event) 
  var payment = document.getElementById('payment').value;
  var phone = document.getElementById('phone').value;
  if (payment == "Cash") 
    alert("Paying with Cash!");
   else 
    alert("Paying with Mpesa!");
    var valid = false;
    if (isSuccess) 
      return;
    
    event.preventDefault();

    $.ajax(
      url: 'payment/MpesaProcessor.php',
      type: 'POST',
      data: 
        'amount': $('#parkingcharge').val(),
        'phone': $('#phone').val(),
      ,
      success: function(text) 
        console.log(text);
        if (text == "success") 
          alert("Click Ok Once Payment Has been Received");
          isSuccess = true;
          $('#myform').submit();
         else 
          alert("Payment Not Successful")
        
      
    );
  
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<html>

<head>
</head>

<body>
  <form id="myform">
    <select id="payment">
      <option value="Cash" >
      Cash
      </option>
      <option value="Mpesa" >
      Mpesa
      </option>
    </select>
    <input id="parkingcharge" type="number" step="any" />
    <input id="phone" />
    <input type="submit"/>
  </form>
</body>

</html>

【讨论】:

一个快速的,每当我添加 method=POST 然后它不会提交 您能否提及您在浏览器控制台中是否收到任何错误?

以上是关于使用 preventDefault 功能后有没有办法提交这个表单?的主要内容,如果未能解决你的问题,请参考以下文章

滑动时报错[Intervention] Unable to preventDefault inside passive event listener due to target being treat

引导验证(成功)后,表单使用默认方法而不是 ajax 提交。 e.preventDefault() 不起作用?

调用 e.preventDefault() 后提交表单

如何在使用event.preventDefault()时使用.submit()或如何不相互取消?

如何提交表单并绕过 preventDefault

jQuery - e.preventDefault 难题/阻止默认后无法提交表单