使用 ajax 验证 jquery / 标准 javascript 提交表单

Posted

技术标签:

【中文标题】使用 ajax 验证 jquery / 标准 javascript 提交表单【英文标题】:submit form with ajax validation jquery / standard javascript 【发布时间】:2015-12-12 01:13:07 【问题描述】:

首先我要道歉 - 我是一名 .NET 编码员,几乎没有(没有)前端经验。

当用户点击提交时,表单需要调用一个 REST 服务,如果服务返回 true,那么用户会收到一个警告,指出存在重复,并询问他们是否要继续。感谢任何帮助。

我将提交按钮 ONCLICK 连接到 Approve()

当 checkForDuplicateInvoice() 被调用时,它会在 ajax 调用有机会获得结果之前立即将控制权传递回调用函数。效果是 Validate() 函数完成时不考虑是否存在重复发票。

我需要帮助修改表单,以便当用户单击提交按钮时,表单在最终提交之前验证(包括对 db 的 ajax 调用)。

我根据 Jasen 的反馈修改了代码。

我在标题中包含https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js。

我现在得到的错误是“对象不支持属性或方法'按钮'”

我现在提交/验证的表单是:

 $(document).ready(function () 
        $("#process").button().click( function () 
            if (ValidateFields())  // internal validation
                var companyCode = document.getElementById("_1_1_21_1").value;
                var invoiceNo = document.getElementById("_1_1_25_1").value;
                var vendorNo = document.getElementById("_1_1_24_1").value;

                if (vendorNo == "undefined" || invoiceNo == "undefined" || companyCode == "undefined") 
                    return false;
                
                $.ajax( // external validation
                    type: "GET",
                    contentType: "application/json;charset=utf-8",
                    //context: $form,
                    async: false,
                    dataType: "jsonp",
                    crossDomain: true,
                    cache: true,
                    url: "http://cdmstage.domain.com/services/rest/restservice.svc/CheckDuplicateInvoice?InvoiceNumber=" + invoiceNo + "&VendorNumber=" + vendorNo + "&CompanyCode=" + companyCode,
                    success: function (data) 
                        var result = data;
                        var exists = result.CheckForInvoiceDuplicateResult.InvoiceExists;
                        var valid = false;
                        if (exists) 
                            if (confirm('Duplicate Invoice Found! Click OK to override or Cancel to return to the form.')) 
                                valid = true;
                            
                        
                        else 
                            valid = true; // no duplicate found - form is valid
                        

                        if (valid) 
                            document.getElementById("_1_1_20_1").value = "Approve";

                            doFormSubmit(document.myForm);
                        
                    ,
                    error: function (xhr) 
                        alert(xhr.responseText);
                    
                );
            
        );
    );

【问题讨论】:

但是你的问题是什么? 您在这里期待什么?我不明白你的问题.. 当 Approve() 调用调用 CheckForInvoice() 的 Validate() 时,CheckForInvoice() 函数会在 ajax 调用返回之前返回控制权,因此 Validate 永远不会从 ajax 调用中获得响应。我不知道如何验证表单并让验证等待结果。 修改了原始帖子以包含一个问题,对不起! 您提出两个请求是否有特定原因:AddInvoice + 提交? 【参考方案1】:

先复习How do I return the response from an asynchronous call? 了解为什么不能从 ajax 回调函数返回值。

接下来,取消提交按钮与表单的关联,以防止其执行默认提交。测试它看看它什么都不做。

<form>
    ...
    <button type="button" id="process" />
</form>

然后将其连接起来以提出您的验证请求

$("#process").on("click", function() 
    if (valid()) 
      $(this).prop("disabled", true);  // disable the button to prevent extra user clicks

      // make ajax server-side validation request
    
);

然后你就可以让你的 AJAX 请求真正异步了。

$.ajax(
    async: true,
    ...,
    success: function(result) 
        if (exists) 
            // return true; // returning a value is futile
            // make ajax AddInvoice call
        
    
);

这个过程的伪代码

if (client-side is valid) 

    server-side validation: 
        on response: if (server-side is valid) 
            AddInvoice: 
                on response: if (successful) 
                    form.submit()
                
            
        
    


    在服务器端验证的回调中发出 AddInvoice 请求。 在 AddInvoice 的回调中,您拨打您的 form.submit()

通过这种方式,您可以嵌套 ajax 调用并等待每个响应。如果有任何失败,请进行相应的 UI 提示并重新启用该按钮。否则,在两个 ajax 调用成功并以编程方式调用 submit() 之前,您不会自动提交表单。

【讨论】:

好的,我现在明白这个概念了——我会在早上的第一件事上试一试!感谢您的详细回复! 我已根据您的反馈修改了问题。我现在得到对象不支持属性或方法“按钮”。我错过了包含吗? 我不再有对象错误 - 现在表单根本没有提交。 $("#process").... 处的断点没有被击中,表单无处可去。再次感谢! 好吧 - 想通了 - 最后一部分只是得到 $(document).ready 的东西,等等。非常感谢 Jasen 的指导!

以上是关于使用 ajax 验证 jquery / 标准 javascript 提交表单的主要内容,如果未能解决你的问题,请参考以下文章

jQuery - 将验证插件与 AJAX 表单插件一起使用

是否可以使用 jQuery 加密 AJAX 调用以进行身份​​验证?

使用 jQuery/ajax 的基本身份验证

使用 jQuery 和 Ajax 进行基本身份验证

jquery+ajax验证不通过也提交表单问题处理

使用 jquery validate 插件成功验证后发送 ajax 请求