【问题标题】:JQuery and HTML5 custom validation not working as intendedJQuery 和 HTML5 自定义验证未按预期工作
【发布时间】:2016-03-05 23:49:53
【问题描述】:

我刚开始在线学习 JS、Jquery 和 HTML。我有一个问题,并尝试做一些类似问题的答案中提到的事情,但这无济于事。

我有一个密码表单,它只接受至少 6 个字符、一个大写字母和一个数字的输入。我希望显示一个自定义验证消息,它可以再次说明这些条件。

这是我的 HTML 代码 -

<div class="password">
     <label for="password"> Password </label>
         <input type="password" class="passwrdforsignup" name="password" required pattern="(?=.*\d)(?=.*[A-Z]).{6,}"> <!--pw must contain atleast 6 characters, one uppercase and one number-->
    </div>

我正在使用 JS 来设置自定义验证消息。

JS代码

$(document).ready(function () {

    $('.password').on('keyup', '.passwrdforsignup', function () {
        var getPW = $(this).value();
        if (getPW.checkValidity() === false) {
            getPW.setCustomValidity("This password doesn't match the format specified");
        }

    });

});

但是,自定义验证消息不显示。请帮忙。非常感谢您! :)

更新 1

我将密码模式更改为(?=.*\d)(?=.*[A-Z])(.{6,})。根据 4castle 的建议,我意识到我的 javascript 中有一些错误,并相应地进行了更改。但是,自定义验证消息仍然不显示。

JavaScript:

$(document).ready(function () {

    $('.password').on('keyup', '.passwrdforsignup', function () {
       var getPW =  $(this).find('.passwrdforsignup').get();       
        if (getPW.checkValidity() === false) {
            getPW.setCustomValidity("This password doesn't match the format specified");
        }

    });

});

再次,比你们都提前!

【问题讨论】:

  • @thisOneGuy,不。 required 是一个标志,pattern 是一个属性。可以这样写:required="true" pattern="blah".
  • @jsve 谢谢,之前没遇到过
  • 将您的模式更改为(?=.*\d)(?=.*[A-Z])(.{6,}),以便有一个捕获组。
  • checkValidity 是否使用该模式?如果您发布代码会有所帮助。
  • 4castle,谢谢,我会改变模式。此外,这确实是我所有相关的代码。我假设 checkValidity 考虑了该模式,如果没有,它到底在检查什么?输入类型?

标签: javascript jquery html validation


【解决方案1】:

首先,更新一下:

var getPW =  $(this).find('.passwrdforsignup').get();

到这里:

var getPW =  $(this).get(0);

...因为$(this) 已经是文本框.passwrdforsignup,所以你自己找不到!

setCustomValidity 的问题在于,它仅在您提交表单后才起作用。所以可以选择这样做:

$(function () {
    $('.password').on('keyup', '.passwrdforsignup', function () {
       var getPW =  $(this).get(0);    
       getPW.setCustomValidity("");
        if (getPW.checkValidity() === false) {
            getPW.setCustomValidity("This password doesn't match the format specified");
            $('#do_submit').click();
        }
    });
});

请注意getPW.setCustomValidity(""); 重置消息这很重要,因为如果您不这样做,getPW.checkValidity()始终false

为此,文本框(和提交按钮)必须位于 form 中。

Working JSFiddle

【讨论】:

  • 非常感谢 WcPc。详细的解决方案极大地帮助我了解了我哪里出错了!真的很感激!自定义验证消息现在按预期显示。
【解决方案2】:

这里有几个问题。

  1. 该模式没有捕获组,因此从技术上讲,没有任何东西可以匹配它。将模式更改为(?=.*\d)(?=.*[A-Z])(.{6,})
  2. $(this).value() 不是指input 标签的值,而是指.password 的值,即容器的div。
  3. getPW.checkValidity()getPW.setCustomValidity("blah") 正在一个字符串上运行,该字符串没有这些函数的定义,只有 DOM 对象有。

你应该这样做(来自this SO answer的JS代码)

$(document).ready(function() {
  $('.passwrdforsignup').on('invalid', function(e) {
    var getPW = e.target;
    getPW.setCustomValidity("");
    if (!getPW.checkValidity())
      getPW.setCustomValidity("This password doesn't match the format specified");
  }).on('input', function(e) {
    $(this).get().setCustomValidity("");
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form>
  <div class="password">
    <label for="password">Password</label>
    <input type="password" class="passwrdforsignup" name="password" 
           required pattern="(?=.*\d)(?=.*[A-Z])(.{6,})" />
  </div>
  <input type="submit" />
</form>

【讨论】:

  • 感谢 4Castle 的积分!我将进行必要的更改。但是,对于第 3 点,我认为 checkValidity() 会自动检查输入的有效性(如w3schools.com/js/js_validation_api.asp 所示)。我的功能基于此。这是我需要链接到的单独库吗?
  • 哇!抱歉,这些功能对我来说是新的。它在该页面上显示它们必须在 DOM 对象上运行,所以我现在更改了我的答案,以便它是正确的。非常感谢!
  • 嗨 4castle,感谢您更新的答案。但是,它仍然不能解决问题。这是我的代码 - $(document).ready(function () { $('.password').on('keyup', '.passwrdforsignup', function () { var getPW = $(this).find('.passwrdforsignup').get(); if (getPW.checkValidity() === false) { getPW.setCustomValidity("This password doesn't match the format specified"); } }); });
  • 我做了更多的研究,发现.checkValidity() 不受许多浏览器的支持。我还发现了一个名为oninvalid 的事件非常适合此问题,并找到了一个 SO 答案,可以使用它来满足您的需求。让我知道它是否适合您!
  • 糟糕,支持 nvm。但是改用这个 JS 代码会快得多,因为它只在每次提交点击而不是每次键入时检查有效性。
猜你喜欢
  • 2011-08-16
  • 2020-12-26
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多