2016-03-05 2 views
6

Я только начал изучать JS, Jquery и HTML в Интернете. У меня есть вопрос, и я попытался сделать то, что было сказано в ответах на подобные вопросы по SO, но это не поможет.Пользовательская проверка JQuery и HTML5 не работает по назначению

У меня есть форма пароля, которая принимает только входные данные, которые имеют как минимум 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"); 
     } 

    }); 

}); 

Однако сообщение пользовательские проверки не отображается. Пожалуйста помоги. Огромное спасибо заранее! :)

UPDATE 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"); 
     } 

    }); 

}); 

Опять же, чем вы все заранее!

+0

@thisOneGuy, no. 'required' - это флаг, а' pattern' - атрибут. Его можно записать так: 'required =" true "pattern =" blah "'. –

+0

@jsve спасибо, не встретили этого до – thatOneGuy

+0

Измените свой шаблон на '(? =. * \ D) (? =. * [AZ]) (. {6,})', так что есть группа захвата , – 4castle

ответ

3

Сначала обновите эту:

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

к этому:

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

... потому что $ (это) уже текстовое поле .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

+0

Спасибо, что так много WcPc. Подробное решение очень помогло мне понять, где я ошибся! Действительно ценю это! Пользовательское письмо проверки правильности выглядит так, как предполагалось. –

+0

Добро пожаловать :) – WcPc

3

Здесь несколько вопросов.

  1. У шаблона нет группы захвата, поэтому технически ничто не может сравниться с ней. Измените шаблон на (?=.*\d)(?=.*[A-Z])(.{6,})
  2. $(this).value() не относится к значению тега input, это относится к значению .password, которое является контейнером div.
  3. getPW.checkValidity() и getPW.setCustomValidity("blah") получают пробег в строке, которая не имеет определений для этих функций, только объекты DOM.

Вот что вы должны сделать вместо (JS код из this SO answer)

$(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>

+0

Спасибо за баллы 4Castle! Я сделаю необходимые изменения. Однако для точки 3 я думал, что checkValidity() автоматически проверяет правильность ввода (как показано на http://www.w3schools.com/js/js_validation_api.asp). Я основывал свою функцию на этом. Это отдельная библиотека, с которой мне нужно связать? –

+0

Woah! Извините, эти функции были для меня новыми. На этой странице показано, что они должны запускаться на объектах DOM, поэтому я изменил свой ответ сейчас, чтобы он был прав. Большое спасибо! – 4castle

+0

Привет, 4castle, спасибо за обновленный ответ. Тем не менее, это все еще не делает трюк. Вот мой код еще раз - '$ (документ) .ready (функция() { $() на ('KeyUp ' '.passwrdforsignup', функция() { вар getPW = $ (' пароль.'. это) .find ('. passwrdforsignup'). get(); if (getPW.checkValidity() === false) { getPW.setCustomValidity ("Этот пароль не соответствует указанному формату"); } }); }); ' –

Смежные вопросы