【问题标题】:jQuery Validation plugin, Enable a checkbox when a field is valid [closed]jQuery Validation 插件,当字段有效时启用复选框 [关闭]
【发布时间】:2013-10-25 09:06:59
【问题描述】:

我正在使用 jQuery、jQuery Mobile 和 jQuery Validation 插件

我有一个“密码”字段和一个“记住密码”复选框。

我希望仅在验证密码字段后启用该复选框。

这是 HTML 中的两个字段

<input type="password" name="password" class="submit required" minlength="6" />
<input type="checkbox" name="rememberpassword" value="remember" />

要启用或禁用复选框,我使用 jQuery Mobile 命令

$('[name=rememberpassword]').checkboxradio( "enable" ); and
$('[name=rememberpassword]').checkboxradio( "disble" );

我不知道可以在验证规则中的何处添加此命令。

我尝试在密码字段的验证规则中添加启用/禁用命令,如下所示:

$(form).validate({
      rules: {
        password: {
          required: {
            depends: function(element) {
              console.log('In the password depends');
              if (!$(element).hasClass('error')) {
                $('[name=rememberpassword]').checkboxradio("enable");
              } else {
                $('[name=rememberpassword]').checkboxradio("disable");
              }
              return true;
            }
          }
        }
      }
    });

这种方法的问题是,有效和错误类被添加到元素中,仅在密码字段中的第一个数据输入后才进行验证,因此复选框仍然有效。

我也尝试使用 .valid() 方法验证表单或密码字段,但只要该字段未填充任何内容,这似乎没有任何作用。

我尝试做同样的事情,但在密码上使用.valid() 方法而不是测试错误类的存在,但这会导致递归,直到返回错误。

我没有找到一种方法来检查不会触发完整验证和后续递归的字段的有效性。

任何帮助将不胜感激。

【问题讨论】:

  • 请显示所有尝试。我很想看看您在使用.valid() 时是如何尝试的。
  • 嗨 Sparky,对不起,我用各种扭曲的逻辑做了很多尝试,以至于我真的不记得我用 .valid() 函数尝试了什么,对不起... :-(

标签: jquery jquery-mobile jquery-validate


【解决方案1】:

条件规则/函数仅适用于:

  • 当规则依赖于其他东西时。 (例如:只有勾选了复选框时,该字段才是“必填项”。)

不是用于:

  • 只要满足某个字段的规则,就运行一个函数。

是的,如您所见,如果您碰巧使用.valid() 作为规则条件的一部分,则会导致递归。


解决方案是使用keyup 事件处理函数和the .valid() method 来检查字段的状态。

$(document).on('pageinit', function () { // <- DOM ready handler for jQuery Mobile

    // initialize plugin with .validate()
    $('#myform').validate({ 
        // your rules & options
    });

    // fire this function on every key-up event within the password field
    $('input[name="password"]').on('keyup', function () { 
        if ($(this).valid()) {             // <- check if password field is valid
            $('[name="rememberpassword"]')
                .checkboxradio('enable');  // <- enable checkbox
        } else {
            $('[name="rememberpassword"]')
                .checkboxradio('disable')  // <- disable checkbox
                .attr('checked',false)     // <- uncheck checkbox if checked
                .checkboxradio('refresh'); // <- refresh checkbox
        }
    });

});

工作演示:http://jsfiddle.net/6eEBC/

我选择不将这部分作为插件的 onkeyup 回调函数的一部分,因为这将应用于表单上每个字段的每个 keyup 事件。

我还“取消选中”该复选框,因为我想,如果它再次被禁用,您不希望它停留在“选中”状态。

根据the jQuery Mobile docs,您需要在“通过JavaScript 操作复选框”时使用.checkboxradio('refresh') 来更新视觉样式。根据该页面上的示例,它仅在您以编程方式选中/取消选中复选框时适用。

【讨论】:

  • 嗨 Sparky,谢谢,我试图严格遵守验证插件的限制,当您的解决方案有效时,它确实违反了验证插件设置的规则,在初始数据输入插件时惰性验证,仅在用户退出该字段时显示一条消息,一旦显示该消息,插件将变为严格验证并按击键显示错误消息。当您的解决方案起作用时,立即出现错误消息可能会令人恼火。我能想到的唯一解决方案是在keyup 部分复制验证规则。谢谢。
  • 关于.checkboxradio('refresh')我发现我不需要在启用/禁用复选框时使用它。在进行更重的操作时需要刷新,例如动态添加复选框。跨度>
  • @Raymond,仅根据 jQuery Mobile 文档和示例推荐“刷新”。如果您认为不需要它,只需将其删除。至于 jQuery Validation 插件提出的“破坏规则”;这个解决方案没有这样的事情。但是,您从未在 OP 中描述应该通过哪些“事件”触发此启用/禁用功能。按键似乎最合乎逻辑,所以这就是我使用的。否则,什么触发器会启用复选框?同样,我的解决方案同样有效,只需将事件更改为 blur
  • 引用@Raymond:“我能想到的唯一解决方案是在keyup部分复制验证规则。” ~ 那么使用这个插件就没有意义了,因为它是不再进行验证。无论如何,您询问了如何使用此插件完成此操作,我展示了一个可以轻松用于任何触发事件的具体示例。
  • 嗨 Sparky,对不起,我不想开始争论,我只是指出了我认为您所提供的解决方案的弱点,这个网站是关于寻找最好的解决方案并讨论它们公然。虽然您的回答并未涵盖我的所有需求,但它确实帮助我了解了该插件的局限性。我将使用该插件来验证其他字段,并针对此特定要求使用自制解决方案。
猜你喜欢
  • 2014-11-20
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
  • 2014-07-05
  • 1970-01-01
相关资源
最近更新 更多