【问题标题】:Preventing form from being submitted with manual validation防止通过手动验证提交表单
【发布时间】:2012-10-02 18:22:35
【问题描述】:

在以下帖子的帮助下,我使用 JQuery 和不显眼的验证实现了一些自定义验证逻辑:

Manually set unobtrusive validation error on a textbox

为了节省您阅读这篇文章的时间,这里有一个简单的 javascript,它会在出现故障时强制显示验证消息:

在我的文本框.blur():

var errorArray = {};
errorArray["Slug"] = 'Some error message for the Slug text box';
$('#SomeFormId').validate().showErrors(errorArray);

效果很好。

我的问题是在显示失败的验证消息时,单击提交时表单提交就好了。

如何使用上面的代码实现自定义验证并防止在显示消息时提交表单?我厌倦了像$('#SomeFormId').valid = false; 这样的事情,但它没有用。

谢谢。

【问题讨论】:

  • 您是否也在提交时验证您的表单?你能分享更多的代码吗?如果表单未通过验证,Jquery 的 validate 应该会阻止表单提交,所以看起来有问题。
  • 我在提交按钮 click() 上没有任何额外代码。

标签: javascript jquery jquery-validate unobtrusive-validation


【解决方案1】:

使用$('#SomeFormId') 将不起作用,因为当你这样做时:

$('#SomeFormId').valid = false;

然后当您再次使用表单submit 处理程序访问它时(我假设):

var form = $('#SomeFormId');   // or $(this)
if (form.valid) {
    //
}

您实际上是在创建两个不同的对象,即使它们指的是同一个 DOM 元素。所以将valid = true设置在一个不会在第二个更新它。

您提供的代码非常简单,所以我假设您的验证与您的submit 处理程序是分开的(因为它在blur 中),所以您可以做的是使用类似.data() 的东西或一个标志(只要确保它在上下文中)。

// on blur
$('#SomeFormId').data('isvalid', false);    // invalid

// on submit
var isvalid = $('#SomeFormId').data('isvalid');
if (!isvalid) {
    // invalid form
    ev.preventDefault();
}

编辑

jQuery 事件对象

当您在 jQuery 中将函数绑定为事件处理程序时,jQuery 默默为您做的一件事就是它为您“创建”了一个规范化的 Event 对象。这将包含有关您可以在处理程序中使用的事件的信息,并且还允许您以某些方式控制事件的行为。

// setting a submit event on my form
//                                       |   whatever you put here 
//                                       V   is the event object.
$('#SomeFormId').on('submit', function (ev) {

    // preventing the default action
    // : in a form, this prevents the submit
    ev.preventDefault();
});

【讨论】:

  • 抱歉,还在学习中。我可以确认吗? ev = 返回事件参数?
  • ev 是 jQuery 事件对象。它被传递到您在 jQuery 中作为事件处理程序绑定的任何函数。让我在编辑中澄清一下。
  • 这行得通。谢谢你。在我结束这个问题之前,您是否碰巧知道在屏幕上保留错误消息的好方法。这个逻辑肯定会阻止表单提交但不显示验证。当然,我可以复制我在 blur() 上使用的逻辑确实显示错误,但你能想出一个好方法来避免重复代码并在表单提交受限时将错误保留在屏幕上吗?
  • 由于您在blur 上进行验证,我建议您保留负责在blur 处理程序中 显示验证消息的逻辑。我不完全理解“将它们保留在屏幕上”的意思,因为就我而言(并且没有查看更多代码),这听起来像是在 DOM 上显示/隐藏文本的问题.例如,您可以使用 CSS 之类的微不足道的东西来做到这一点。
  • 简单地说,当文本框上的 blur() 发生验证失败时,会显示错误消息。接下来我单击提交,表单被限制提交,但红色验证消息现在消失了!我正在寻找在提交被拒绝后保留消息的方法。很抱歉有任何混淆。
【解决方案2】:

要检查表单是否有效,您可以使用以下内容:

var form = $("#SomeFormId");
form.submit(function(event) {
    if(form.valid() == false) event.preventDefault();
}

编辑添加了更多内容,这将负责您的提交/预防,现在您只需添加您的验证调用。

【讨论】:

  • 添加到提交按钮点击?您将如何实现“防止提交”的发生?
  • 不幸的是没有工作。可能是理查德上面提到的原因?
猜你喜欢
  • 2014-11-15
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多