【问题标题】:Submit form and replace submit button with progress indicator提交表单并用进度指示器替换提交按钮
【发布时间】:2012-11-02 12:41:18
【问题描述】:

因此,很遗憾,我们网站上有很多表单需要一段时间才能提交。

我想做的是编写一个通用脚本,在提交或单击提交按钮时将提交按钮替换为加载指示器,然后提交表单,遵循表单提交操作所做的任何重定向。

如果我使用 jQuery 替换表单提交上的按钮,它不会替换提交按钮,但仍会提交表单。决定在 .click() 上执行此操作,这会导致加载指示器替换提交按钮,但表单未提交。还尝试替换提交按钮然后放置一个setTimeout并导致提交按钮的父级使用jQuery submit() 函数提交,均无济于事。

我也经历过 AJAX 提交等,但每个都有自己的问题。

目前我的代码是:

$("#content form :submit").click(function(data) {
    $(this).replaceWith('<img src="loader.gif" alt="submitting form" style="display:block; margin:0 auto">');
    var form = $(this).parent("form");
    setTimeout(function() {
        console.log(form);
        form.submit();
    },1000);    
});

我知道这个当前的代码是错误的,但我经历了很多不同的解决方案,得到了 90% 的结果,以至于我有点失去了它。有关如何执行此操作的任何建议?

编辑:抱歉,当我第一次提交时,我认为这不够明显。提交时,至少 Safari 上的 DOM 不再更新。尽管动作发生了,但 DOM 并没有改变并且提交发生了。结果是表单像往常一样提交,并且没有发生加载 gif。我认为将实际的表单提交延迟到 DOM 更新之前会修复它,但它似乎没有提交(1000 很长,但希望先让事情正常工作)。此外,如果我将侦听器放在提交而不是单击并尝试在其中调用 submit() 它将导致无限循环。

【问题讨论】:

    标签: jquery forms click submit


    【解决方案1】:

    您需要将处理程序绑定到表单的submit 事件,而不是提交按钮上的click 事件:

    $("#content form").submit(function(e) {
        var $this = $(this);
        $('<img />', {
            'src': 'loader.gif',
            'alt': 'submitting form',
            'class': 'loading',
            'style': 'display: block; margin: 0 auto;' // Use a class instead
        }).appendTo(this);
    
        $this.find(':submit').hide();
    
        e.preventDefault();
    
        $.ajax({
            type: $this.attr('method') || 'get',
            url: $this.attr('action') || window.location,
            data: $this.serialize(),
            success: function(response) {
                $(this).find('.loading').remove();
                $(this).find(':submit').show();
            }
        });
    });
    

    【讨论】:

    • 似乎在同一个submit处理程序中递归调用submitpreventDefault()
    • 为什么要使用超时?此外,event 应该是 e 根据您的参数。
    • @charlietfl:已修复。在 jQuery 对象上调用 submit() 会触发 submit 处理程序,但在 DOM 对象上调用 submit() 不会:jsfiddle.net/kTt2T/1
    • 我也是这么想的……只用jQuery方法,永远不会提交给我的想法
    • 更新了问题,以更好地解释延迟的原因。
    【解决方案2】:

    您可以隐藏提交输入而不是删除它。在我看来,这比使用超时和类似的东西要干净得多。

    ​$('form').on('submit', function(e){
        var submitButton = $(this).find('input[type=submit]');
        $(this).append('<span>submitting...</span>');//Replace with whatever you want
        submitButton.css('display', 'none');
    });​​​​​
    

    http://jsfiddle.net/g7GgU/

    【讨论】:

    • 这是我最初拥有的,但提交导致 DOM(至少在 Safari 上)停止更新。如果我返回 false,它会按预期工作,当然它不会提交。
    • 它适用于我,即使在 Safari 中也是如此。问题到底出在哪里?
    • 我再次测试过它,它对我不起作用。你用的是什么Safari? Firefox 可以,但我怀疑 Chrome 会是一样的。
    猜你喜欢
    • 2011-10-23
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 2012-02-10
    • 1970-01-01
    • 2014-03-23
    相关资源
    最近更新 更多