【问题标题】:jQuery on submit validation, with modal dialog at the end?jQuery提交验证,最后有模式对话框?
【发布时间】:2012-03-19 03:25:56
【问题描述】:

我现在有一个表单要验证,假设一切正确,我希望它会弹出一个对话框来确认他们的详细信息,这是我到目前为止的代码示例:

var userConfirmed = false;

$("#dialog").dialog({
    buttons: {
        "Yes": function() {
            userConfirmed = true;
            $("#inputform").submit();
        },
        "No, I'll change them.": function() {
            $(this).dialog("close");
        }
    }
});

// check they've submitted what they need to
$("form").submit(function() {

    // lots of these
    if (something) {
        return false;
    }

    $("#dialog").dialog("open");

    return userConfirmed;

});

初始验证工作正常 - 它检查标准并标记为适当,如果不满足任何标准,它将按照我的意愿显示模态框。到目前为止,一切顺利。

但问题是,当我按下“是”提交表单时,它不会提交,直到您再次按下实际的“提交”按钮,啊!使用 jQuery 提交论坛的任何调用都会失败。

非常欢迎任何建议,谢谢。

【问题讨论】:

标签: jquery validation dialog modal-dialog jquery-ui-dialog


【解决方案1】:

对话框打开并不会停止代码的执行。 valToReturn 甚至在设置之前由 $("form").submit() 返回。

你可以这样做:

//Save the default behavior to break any loops
var defaultSubmit = $.extend(true, {}, $("form").submit);

$("form").submit(function(e) {

    var valToReturn = true;

    // lots of these
    if (something) {
        return false;
    }

    // popup the dialog confirmation
    $("#dialog").dialog({
        buttons: {
            "Ok": function() {
                $(this).dialog("close");
                defaultSubmit(); // User confirmed, submit form.
            },
            "Cancel": function() {
                $(this).dialog("close"); // Form already prevented from submitting. Exit quietly.
            }
        }
    });

    $("#dialog").dialog("open");

    return false; // Prevent form from being submitted

});

【讨论】:

  • 啊!感谢您的更新:) 这是一个好主意,我在发布之前尝试过,但不幸的是它会导致不断尝试调用 form.submit 函数的无限循环
  • 尝试将现有的$("form").submit() 保存到变量中,然后使用jQuery 更改功能。在您的 OK 函数中,您只需调用保存的版本,表单就会正确处理。
  • 感谢更新,不幸的是它仍然导致无限循环
  • 我喜欢保存最后一个处理程序的一般想法,但是这段代码真的能做到吗?据我所知,它会将$.fn.submit 保存在一个var 中,然后在没有任何this 的情况下调用它,我认为这根本行不通。即使您使用$.proxy 将其绑定到正确的元素,它仍然是相同的函数,因此将再次调用自定义处理程序。
  • 是的,不幸的是,在“确定”按钮按下时,defaultSubmit() 函数调用似乎只是再次运行提交函数,弹出对话框:(我已经更新了我的初始帖子,感觉就像正在取得进展,但是废话
【解决方案2】:

在某处添加一个标志,说明对话框是否已经出现,并且用户单击“是”。示例:

var userConfirmed = false;
$("form").submit(function(e) {
    if ( userConfirmed ) {
        userConfirmed = false; // Reset it to false
        return true; // No need to validate anything, that was already done last time
    }
    var form = $(this);
    // ...
        "Yes": function() {
            userConfirmed = true; // Confirm that the dialog was shown and the user clicked "Yes"
            $(this).dialog("close");
            form.submit(); // Try again; this time, the validation was already done
        },
    // ...
    return false; // Don't submit; the user haven't confirmed the info on the dialog
});

如果没有该标志,您将处于先有鸡还是先有蛋的境地:提交打开对话框,调用$("form").submit() 的对话框再次打开对话框...

如果您有许多表单并且不想使用“全局”变量,您可以使用data 来达到同样的目的。

更新:jsFiddle 上的实时示例。在 Chrome 和 Firefox 中测试成功(提交后 3 秒会显示空白页)。

【讨论】:

  • 这是个好主意,谢谢。我主要担心的是,如果对话框呈现给用户并且他们编辑了他们的数据,那么在他们提交之前它不会再次出现最终提示。我知道这听起来像糟糕的设计,但不幸的是这是一个要求:$
  • 该死,忽略我 - 抱歉,我才意识到您的 dialogAppeared 标志设置 当用户单击“是”时。 :-)
  • 您的意思是,如果用户选择“取消”?这样,dialogAppeared 就不会设置为 true(请注意,只有“是”按钮设置它)。也许我应该为那个变量使用一个更好的名字...... [完成]
  • 这很奇怪……很遗憾,我帮不了你。但是 remibreton+PCasagrande 的更新答案看起来很有希望,我会说比我的更干净,你可以尝试一下
  • jsFiddle 添加了一个实时示例,它运行良好。我敢打赌,您的“是”按钮中引发了一些您没有注意到的异常,这就是为什么它仅在再次单击该按钮后才起作用(此时该变量仍然为真)
【解决方案3】:

一如既往,我建议使用jQuery validate 进行验证,然后代码将如下所示

$("#formid").validate({
    submitHandler: function(form) {
               $("#dialog").dialog({
     buttons: {
         "Ok": function() {
             form.submit();
             $(this).dialog("close");
         },
         "Cancel": function() {
             $(this).dialog("close");
         }
     }
});
    }
});

LIVE DEMO

【讨论】:

  • 非常感谢,我想尽可能避免使用外部插件,但看起来我应该检查一下这个
  • 值得注意的是,这个插件是由 jQuery 团队的成员构建的,被广泛用于验证表单,可以为您节省大量编写代码的时间
  • 刚刚尝试实现这一点,它非常好(谢谢),但它与目前整个站点生成错误的方式非常不一致(使用 jGrowl 调用并关注有错误的元素)和结果将花费大量时间来实施:(不过谢谢,这是一个很好的建议。
【解决方案4】:

我会将事件附加到按钮而不是表单。只需将其附加到提交按钮单击即可。然后您可以使用event.preventDefault() 阻止表单提交,直到对话得到确认。在“是”功能中只需输入$('form').submit()。也不用担心这样的返回值。

【讨论】:

  • 谢谢,我确实考虑过这一点,但是当用户只需按回车键提交表单时,它会变得很尴尬。
猜你喜欢
  • 2012-05-05
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多