【问题标题】:Button loading and control property not getting changed on form submit表单提交时按钮加载和控件属性未更改
【发布时间】:2015-05-25 12:41:20
【问题描述】:

所以我有一个表单,我在提交之前使用 jquery-form-validator 插件进行验证!但是这里的问题是写在success 上的几行代码在逐步执行时没有被执行。 但是,如果在 console 中执行或在 debugger 中执行,它们可以正常工作。真的是一种诡异的行为!!有什么解决方法可以解决这个问题吗?

JS

$.validate({
    form:'#contact-form',
    onError: function () {
        toastr.error("Please correct the below errors!", "Error");
        return false;
    },
    onSuccess: function () {
        $("#btnContactUs").button('loading'); //Not getting called
        $('.form-contact form').find('input,textarea').attr('readonly', true).addClass('disabled'); //Not getting called
        var formdata = new FormData($('.form-contact form').get(0));
        $.ajax({
            url: $("#contact-form").attr('action'),
            type: 'POST',
            data: formdata,
            processData: false,
            contentType: false,
            success:function(data)
            {
                if(data.result)
                {
                    toastr.success(data.message, "Success");
                    $('.form-contact form').get(0).reset();//Check this
                }
                else
                {
                    toastr.error(data.message, "Error");
                }
            },
            error:function(data)
            {
                toastr.error(data.message, "Error");
            }
        });
        $("#btnContactUs").button('reset');
        $('.form-contact form').find('input,textarea').attr('readonly', false).removeClass('disabled');
        return false; // Will stop the submission of the form
    }
});

验证成功后,它通过 ajax 调用 Controller 方法,但不执行前 2 行。

更新:按钮#btnContactUs 是一个引导按钮,具有.button 功能来显示加载文本。

【问题讨论】:

  • afaik .button 什么都不是 - 使用 .text('loading')
  • 另外,第 2 行应该做什么?禁用所有表单元素?
  • 你能在你的 ajax 调用中尝试使用 asyn:false 吗
  • @Darren Sweeney.. 对不起!!忘了说!!这是一个引导按钮,您可以在其中使用.button 功能来显示加载文本!是的,第 2 行不会 disable,而只是为所有表单元素添加一个只读属性,仅出于 UI 目的,我为该 disabled 类定义了一些 CSS!!
  • 我认为你的 onSuccess() 方法的 return false 在你的内部 ajax 成功回调可以运行之前执行。当你放一个调试器时,ajax成功回调事件发生,你的代码运行正常。

标签: javascript jquery ajax forms jquery-form-validator


【解决方案1】:

您的 onSuccess() 方法的 return false 在您的内部 ajax 成功回调可以运行之前执行。当你放置一个调试器时,ajax成功回调事件发生,你的代码运行良好。

我们可以通过 jquery 的 $.when.then 功能解决这个问题,如下所示:

$.when(
            $.ajax({
                url: $("#contact-form").attr('action'),
                type: 'POST',
                data: formdata,
                processData: false,
                contentType: false,
                success:function(data)
                {
                    if(data.result)
                    {
                        toastr.success(data.message, "Success");
                        $('.form-contact form').get(0).reset();//Check this
                    }
                    else
                    {
                        toastr.error(data.message, "Error");
                    }
                },
                error:function(data)
                {
                    toastr.error(data.message, "Error");
                }
            })
        ).then(function(){
            $("#btnContactUs").button('reset');
            $('.form-contact form').find('input,textarea').attr('readonly', false).removeClass('disabled');
        });

【讨论】:

  • 添加了答案,现在您可以提供解决方案了
【解决方案2】:

这通常发生在您尝试访问的控件不可用或者您在前一个进程完成之前启动一个进程时。为了在任何情况下都运行 AJAX,请尝试在未执行的行上方添加以下 setTimeout 或 SetInterval。

语法: 设置超时:http://www.w3schools.com/jsref/met_win_settimeout.asp 设置间隔:http://www.w3schools.com/jsref/met_win_setinterval.asp

希望这会有所帮助!

【讨论】:

  • 这可能是解决问题的方案之一!但我想我找到了合法的答案!我会尽快发布的!!无论如何 +1 为你的努力.. :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
  • 2014-03-29
  • 2019-03-24
相关资源
最近更新 更多