【问题标题】:jQuery Stop validation on cancel ui dialogjQuery在取消ui对话框上停止验证
【发布时间】:2016-12-17 01:30:24
【问题描述】:

我有几个定义了单独验证器的表单。这些都可以正常工作并按预期进行验证。但是,如果我单击对话框中的取消按钮,它仍然会验证表单并显示错误。我必须单击取消按钮两次才能关闭表单。如果我单击 [x] 关闭对话框,我会短暂看到错误消息,但表单会关闭。我可以忍受。

这是我的代码:

var renewValidator = $("#FormRenew").validate({
  rules: {
    NewNo: {
      remote: {
        url: "action.php?checkDup=1"
      }
    }
  }
});

$("#dialog").dialog({
  bgiframe: true,
  autoOpen: false,
  width: 450,
  modal: true,
  buttons: {
    'Renew': function() {
      if (renewValidator.valid()) {
        $.ajax({
          type: "POST",
          url: "ajax.php",
          data: queryString,
          success: function(msg) {...
                                 }
                                 });
          $(this).dialog('close');
        }
               },
               Cancel: {
               text: 'Cancel',
               immediate: "true",
               formnovalidate: 'formnovalidate',
               class: 'cancel',
               click: function(e) {
          console.log('Cancel clicked!');
          e.preventDefault();
          $("form").validate().cancelSubmit = true;
          $(this).dialog('close');
        }
      }
    },
    beforeClose: function() {
      renewValidator.resetForm();
      $("#FormRenew").trigger("reset");
    }
  });

最初我只是有一个简单的取消,像这样取消:

function() {
    $(this).dialog('close');
}

但我添加了其他帖子中建议的各种选项。没有一个适合我。

【问题讨论】:

  • 请创建一个有效的 jsFiddle 演示。
  • 您是否检查了您的 DOM 以确认 formnovalidate="formnovalidate" 是取消按钮的 HTML 标记的一部分?这才是最重要的。如果没有,那么你的 jQuery UI 有问题。
  • 是的,它是:-(
  • @Sparky - 这是一个显示问题的 jsFiddle 演示。 https://jsfiddle.net/3ob9dhxj/
  • 按钮是type="button",因此无需尝试阻止点击验证,因为它不应该首先发生。换句话说,使用type="button",您必须以编程方式触发验证。但是,在您的示例中,我看不到在哪里触发了验证。这是最奇怪的事情。

标签: jquery jquery-validate jquery-ui-dialog


【解决方案1】:

按钮与此完全无关。 当您离开该字段时触发验证。由于模式打开时该字段处于焦点状态,因此只需单击页面上的任何位置都会触发 focusout 事件并因此触发验证。

  1. .validate() 内将onfocusout 选项设置为false 是解决方案的一部分。但是,正如我的 cmets 中所解释的,您根本无法使用任何按钮触发验证,因为它们位于 form 标记之外(而不是 type="submit")。

  2. 将您的renewValidator.valid() 更改为$("form").valid(),以便在单击Renew 时以编程方式触发验证。

重要提示:由于您的按钮在<form> 之外,您还可以删除所有特殊的“按钮取消”代码。当按钮在form 容器之外或在type="button" 时,按钮无法提交或触发验证。

演示:jsfiddle.net/yggg588c/

【讨论】:

  • 不幸的是,我已经尝试过了,尽管 minlength 验证规则仍然有效,但遥控器无效。它触发对远程的调用,但即使返回 false,它也会通过 $("form").valid() 检查:-(我不知道如何模仿 jsFiddle 上的 ajax 远程调用来向您展示
  • @Kirsten,这与我解决的原始问题无关。请使用remote 将您的问题作为一个新问题发布。谢谢。
  • 我有一个遥控器。我想我找到了一种模拟远程呼叫的方法。它应该返回 false 并且我的远程调用返回 false 但在警报值时它说 true 并且表单已提交。这是更新的 jsFiddle http://jsfiddle.net/yggg588c/1/
  • @Kirsten,您在关于remote 的原始问题中完全没有提到任何内容。整个故事是关于取消按钮被破坏的,我经过大量努力后为你解决了这个问题。现在,如果您还有其他问题,请发布一个新问题。否则,原来关于取消按钮坏掉的问题已经完全解释并解决了。
  • 问题似乎是有效检查在检查完成之前返回true。我想我已经找到了解决办法。将 async: true 添加到远程规则似乎可以解决问题。我在这里找到了答案 http://stackoverflow.com/a/12981049/7302483 这是更新后的 jsFiddle http://jsfiddle.net/yggg588c/2/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2013-07-04
相关资源
最近更新 更多