11

我知道这个问题已经被回答了几百次,但我已经经历了很多潜在的解决方案,但它们似乎都不适用于我的实例。

以下是我的表单和提交表单的代码。它触发一个 PHP 脚本。现在我知道脚本本身不是提交的原因,因为我手动尝试了表单并且它只提交一次。

jQuery 代码的第一部分涉及打开一个灯箱并从下面的表格中提取值,我将其包括在内,以防万一它是一个潜在的问题。

jQuery代码:

$(document).ready(function(){
    $('.form_error').hide();
    $('a.launch-1').click(function() { 
        var launcher = $(this).attr('id'),
            launcher = launcher.split('_');
        launcher, launcher[1], $('td .'+launcher[1]);
        $('.'+launcher[1]).each(function(){
            var field = $(this).attr('data-name'),
                fieldValue = $(this).html();
            if(field === 'InvoiceID'){
                $("#previouspaymentsload").load("functions/invoicing_payments_received.php?invoice="+fieldValue, null, function() {
                    $("#previouspaymentsloader").hide();
                });
            } else if(field === 'InvoiceNumber'){
                $("#addinvoicenum").html(fieldValue);
            }
            $('#'+field).val(fieldValue);
        });
    });
    $("#addpayment_submit").click(function(event) {         
        $('.form_error').hide();  
        var amount = $("input#amount").val();  
        if (amount == "") {  
            $("#amount_error").show();  
            $("input#amount").focus();  
            return false;
        }
        date = $("input#date").val();  
        if (date == "") {  
            $("#date_error").show();  
            $("input#date").focus(); 
            return false;
        } 
        credit = $("input#credit").val(); 
        invoiceID = $("input#InvoiceID").val(); 
        by = $("input#by").val(); 
        dataString = 'amount='+ amount + '&date=' + date + '&credit=' + credit + '&InvoiceID=' + invoiceID + '&by=' + by;
        $.ajax({
            type: "POST",
            url: "functions/invoicing_payments_make.php",
            data: dataString,
            success: function(result) {
                if(result == 1){                    
                    $('#payment_window_message_success').fadeIn(300);
                    $('#payment_window_message_success').delay(5000).fadeOut(700);
                    return false;
                } else {
                    $('#payment_window_message_error_mes').html(result);
                    $('#payment_window_message_error').fadeIn(300);
                    $('#payment_window_message_error').delay(5000).fadeOut(700);
                    return false;
                }
            },
            error: function() {
                $('#payment_window_message_error_mes').html("An error occured, form was not submitted");
                $('#payment_window_message_error').fadeIn(300);
                $('#payment_window_message_error').delay(5000).fadeOut(700);
            }
        });
        return false;
    });
});

这是html表单:

<div id="makepayment_form">
  <form name="payment" id="payment" class="halfboxform">
    <input type="hidden" name="InvoiceID" id="InvoiceID" />
    <input type="hidden" name="by" id="by" value="<?php echo $userInfo_ID; ?>" />
    <fieldset>
      <label for="amount" class="label">Amount:</label>
      <input type="text" id="amount" name="amount" value="0.00" />
      <p class="form_error clearb red input" id="amount_error">This field is required.</p> 
      <label for="credit" class="label">Credit:</label>
      <input type="text" id="credit" name="credit" />
      <label for="amount" class="label">Date:</label>
      <input type="text" id="date" name="date" />
      <p class="form_error clearb red input" id="date_error">This field is required.</p>
    </fieldset>
    <input type="submit" class="submit" value="Add Payment" id="addpayment_submit">
  </form>
</div>

希望有人能帮忙,因为它让我发疯。谢谢。

4

7 回答 7

48

有时,您不仅要阻止处理事件的默认行为,还要阻止执行任何下游事件处理程序链。这可以通过调用来event.stopImmediatePropagation()完成event.preventDefault()

示例代码:

$("#addpayment_submit").on('submit', function(event) {
  event.preventDefault();
  event.stopImmediatePropagation();
});
于 2013-09-08T07:42:28.527 回答
6

此外,您将操作绑定到提交按钮“单击”。但是,如果用户在输入文本字段时按下“输入”并触发默认表单操作怎么办?你的函数不会运行。

我会改变这个:

$("#addpayment_submit").click(function(event) {
    event.preventDefault();
    //code
}

对此:

$("#payment").bind('submit', function(event) {
    event.preventDefault();
    //code
}

现在,用户如何提交表单并不重要,因为无论如何您都会捕获它。

于 2013-04-05T00:29:56.760 回答
2

尝试添加以下行。

event.preventDefault(); 
event.stopImmediatePropagation();

这对我有用。

于 2015-01-30T12:30:20.537 回答
1

虽然所有列出的解决方案都是有效的,但就我而言,导致我提交多个表单的原因是 ei 传递给了提交时调用的函数。

我有

$('form').bind('submit', function(e){
  e.preventDefault()
  return false
})

但我把它改成了

$('form').bind('submit', function(){
  event.preventDefault()
  return false;
})

这对我有用。不包括 return false 应该仍然不会阻止代码工作

于 2021-02-15T10:33:27.940 回答
0

在您的点击功能下方,将 a 添加preventDefault()到事件中。

$("#addpayment_submit").click(function(event) {
    event.preventDefault();
    // Code here
    return false;
});

这可能会解决您的问题。preventDeafult()停止触发默认事件。在这种情况下,您的表单在单击时触发,然后在您使用 ajax 函数发送时再次触发。

它还有助于return false;在点击功能的末尾添加(见上文)。

于 2013-04-05T00:07:49.337 回答
0

我最终根据@user2247104 的建议更改了脚本,不幸的是,表单仍然提交了两次。

然而@Cumbo,@Barmar 也在正确的轨道上,除了让它工作

event.preventDefault();

需要放在脚本底部:

});
event.preventDefault();
return false;

感谢大家的帮助:)

于 2013-04-05T01:42:03.467 回答
0

当您使用 AJAX 请求向服务器发送数据时,甚至没有理由使用form标签和<input type="submit" .../>(您可以使用简单的按钮)。我也认为 Cumbo 的回答应该有效。如果不行你也可以试试event.stopPropagation()

于 2013-04-05T00:14:45.560 回答