1

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

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

如果我使用 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() 它将导致无限循环。

4

2 回答 2

3

您需要将处理程序绑定到表单的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();
        }
    });
});
于 2012-11-14T01:25:20.367 回答
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/

于 2012-11-14T01:36:10.437 回答