【问题标题】:Trigger validation after first submit, then after after every keystroke on input element第一次提交后触发验证,然后在输入元素上的每次击键后触发验证
【发布时间】:2016-04-30 17:38:05
【问题描述】:

我正在对下面要讨论的所有内容使用 jquery 验证。

所以我有一个输入字段,我们称之为电子邮件。我也有这个表单的提交按钮。现在默认情况下,在我点击提交按钮之前,电子邮件字段的错误消息不会出现。然后,每当我键入它时,它都会显示/隐藏错误消息,具体取决于它是否是有效的电子邮件。每次击键都会进行此检查,这是一个非常重要的区别,以便您了解我在下面发布的问题。

现在我在输入上有一个背景色,当验证通过时它是绿色的,当它失败时是红色的。我有这部分工作,让我告诉你我是怎么做到的:

window.onload = function () {
    $(".js-validate-circle").on("input", function () {
        UpdateValidationCircle(this);
    });
}
function UpdateValidationCircle(e) {
    if ($(e).valid()) {
        $(e).parent().addClass("active");
    } else {
        $(e).parent().removeClass("active");
    }
}

active 类决定了它是绿色还是红色。我认为有些样式与问题无关,所以我不会在这里发布。

这是我的问题:当页面加载并开始输入时,它会强制触发验证,并且在我第一次单击提交按钮之前开始出现错误消息。我试图阻止这种情况。我希望只有在点击提交按钮后,开始输入的颜色才会改变。我的红色/绿色背景的功能应该与 jquery 验证消息匹配。

我将如何完成这样的事情?我尝试使用 on change 但只有当框失去焦点时才会触发验证。

【问题讨论】:

  • 你说的是 jQuery Validate 插件吗?如果是这样,其余的代码在哪里?打电话给.validate()? HTML 标记?
  • @Sparky HTML 标记对这个问题毫无意义,所以我没有发布它,我也没有在代码中的任何地方调用 .validate() 。这是一个纯 jquery/javascript 问题。 .valid() 调用 .validate(),根据我的在线研究,这不是记录的方式,而是它的行为方式。出于这个原因,我的验证在第一次击键时就开始了。如果 valid() 没有调用 validate,那么我的行为会完全符合我的要求。
  • 如果不先调用.validate(),您将无法使用.valid(),并且如果不包含jQuery Validate 插件,您将无法使用任何一种方法。请参阅:".validate() needs to be called on the form before checking it using this method"

标签: javascript jquery validation


【解决方案1】:
jQuery(function($) { // DOM ready and $ alias in scope

// Cache elements
var $circle = $(".js-validate-circle");
var addedInputEvent = false; // Just a flag to know if we already added the evt listener

// On form submit....
$("#form").on("submit", function(event) {

   // Prevent default form submit
   event.preventDefault();

   // Check immediately
   $circle.each(UpdateValidationCircle);

   // If not already assigned, assign an "input" listener
   if(!addedInputEvent) {
       addedInputEvent = true;
       $circle.on("input",  UpdateValidationCircle);
   }
});

function UpdateValidationCircle() {
  var $el = $(this);
  $el.parent().toggleClass("active", $el.valid());
}

});

【讨论】:

  • 您在上面写的内容只会在我提交按钮后导致我的背景发生变化。这仅适用于第一次击键,然后应在每次击键后检查。
  • 现在我想多了,我真正需要的只是检查一下,是否按下了一次提交按钮?
  • 已编辑以说明“首次提交尝试后允许输入事件”@Bagzli
  • 我看到你正在更新以清理代码,我很感激,我喜欢你所做的,不过我有一个问题。 $circle.each 不应该是 $(circle).each 吗?我问是因为我收到了来自 resharper 的投诉。
  • @Bagzli var $circle = $(".js-validate-circle"); 看到了吗?它已经包含在 jQuery 中。无需再次将 jquery 对象重新包装到 jQuery 中。
【解决方案2】:

改用keyup 事件:

$(".js-validate-circle").on("keyup", function () {
...

假设.js-validate-circle 是您的输入......或者如果它是表单:

$(".js-validate-circle").on("keyup", "#id-of-the-input", function () {
...

如果这不起作用,我们将需要查看validate()s 代码和一些标记。

【讨论】:

  • Q 标题显示 Trigger validation only after submit 但您建议使用 keyup 而非首选(并且已在使用)"input" 事件。
  • 但在描述中他说whenever I type it will show/hide error message dependant on if it is a valid email
猜你喜欢
  • 1970-01-01
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 2023-04-05
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多