Проверка jquery для поля даты

У меня возникла проблема с проверкой полей ввода, у меня есть три поля ввода, одно для имени, фамилии и даты рождения, когда я оставляю поля пустыми, отображаются предупреждающие сообщения, как определено в коде, когда я ввожу данные в поля сообщение исчезнет, ​​за исключением поля даты. Он исчезает, только когда я нажимаю еще раз. Вот мой код

<!DOCTYPE html>
<html>
<head id="html">
	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
	<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>
	<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
	<link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/jquery.ui/1.10.4/themes/redmond/jquery-ui.css">
	<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"> </script>
	<script>
		$(function() {
			$("#date-of-birth").datepicker(
			{
				dateFormat:'dd-mm-yy',
				changeMonth: true,
				changeYear: true,
			});	
		});
	</script>
	<style >
		#first-name{
			width: 300px;
			margin-top: 10px;
			margin-left: 510px;
			padding-left: 10px;
			border: 1px solid grey;
			border-radius: 5px;
		}
		#last-name{
			width: 300px;
			margin-top: 5px;
			margin-left: 510px;
			padding-left: 10px;
			border: 1px solid grey;
			border-radius: 5px;
		}
		#date-of-birth{
			width: 300px;
			margin-top: 5px;
			margin-left: 510px;
			padding-left: 10px;
			border: 1px solid grey;
			border-radius: 5px;	
		}
		#first-name-warning-message{	
			padding-left: 640px;
			font-size: 18px;
			font-weight: bold;
		}
		#last-name-warning-message{
			padding-left: 640px;
			font-size: 18px;
			font-weight: bold;
		}
		#dob-warning-message{
			padding-left: 640px;
			font-size: 18px;
			font-weight: bold;
		}
	</style>
</head>
<body id="body">
	<form id="sign-up" action="#" method="post">
		<div id="row-one">
			<input type="text" id="first-name" name="first_name" placeholder="First Name" maxlength="15">
		</div>
		<div id="span-container">
			<span id="first-name-warning-message" class="text-danger"> </span>
		</div>
		<div id="row-two">
			<input type="text" id="last-name" name="last_name" placeholder="Last Name" maxlength="15">
		</div>
		<div id="span-container">
			<span id="last-name-warning-message" class="text-danger"> </span>
		</div>
		<div id="row-three">
			<input class="date-picker" id="date-of-birth" name="user_dob" placeholder="Date Of Birth" readonly="true">
		</div>
		<div id="span-container">
			<span id="dob-warning-message" class="text-danger"> </span>
				</div>
	</form>
	<script>
		$(document).ready(function(){
			$('#first-name-warning-message').hide();
			$('#last-name-warning-message').hide();
			$('#dob-warning-message').hide();

			var first_name_error=true;
			var last_name_error=true;
			var dob_error=true;

			$('#first-name').focusout(function(){
				validate_first_name();
			});

			$('#last-name').focusout(function(){
				validate_last_name();
			});

			$('#date-of-birth').focusout(function(){
				validate_date_of_birth();
			});

			function validate_first_name(){
				var first_name=$('#first-name').val();
				var first_name_regex=/^[a-zA-Z ]{3,15}$/;
				if(first_name.length==''){
					$('#first-name-warning-message').show();
					$('#first-name-warning-message').html("Please Enter Your First Name !");
					first_name_error=false;
					return false;
				}
				else{
					$('#first-name-warning-message').hide();
				}

				if(first_name.length<3){
					$('#first-name-warning-message').show();
					$('#first-name-warning-message').html("First Name Not Valid !");
					first_name_error=false;
					return false;
				}
				else{
					$('#first-name-warning-message').hide();
				}

				if(!first_name_regex.test(first_name)){
					$('#first-name-warning-message').show();
					$('#first-name-warning-message').html("First Name Must Not Contain Any Digits Or Symbols !");
					first_name_error=false;
					return false;
				}
				else{
					$('#first-name-warning-message').hide();
				}
			}

			function validate_last_name(){
				var last_name=$('#last-name').val();
				var last_name_regex=/^[a-zA-Z ]{3,15}$/;

				if(last_name.length==''){
					$('#last-name-warning-message').show();
					$('#last-name-warning-message').html("Please Enter Your Last Name !");
					last_name_error=false;
					return false;
				}
				else{
					$('#last-name-warning-message').hide();
				}

				if(last_name.length<3){
					$('#last-name-warning-message').show();
					$('#last-name-warning-message').html("Last Name Not Valid !");
					last_name_error=false;
					return false;
				}
				else{
					$('#last-name-warning-message').hide();
				}

				if(!last_name_regex.test(last_name)){
					$('#last-name-warning-message').show();
					$('#last-name-warning-message').html("Last Name Must Not Contain Any Digits Or Symbols !");
					last_name_error=false;
					return false;
				}
				else{
					$('#last-name-warning-message').hide();
				}
			}

			function validate_date_of_birth(){
				var date_of_birth=$('#date-of-birth').val();
				if(date_of_birth.length==''){
					$('#dob-warning-message').show();
					$('#dob-warning-message').html("Please Enter Your Date Of Birth !");
					dob_error=false;
					return false;
				}
				else{
					$('#dob-warning-message').hide();
				}
			}
		});
	</script>
</body>
</html>

вы можете предоставить мне решение для этого ?. Все ответы приветствуются. Заранее спасибо.

У вас есть обработчик события focusout для ввода даты, но когда пользователь хочет выбрать дату, он уже фокусируется. Итак, я думаю, вам следует проверить фокусировку (или размытие). Есть ли в вашей форме кнопка отправки?

Majid Akbari 10.08.2018 17:18

да, я использовал в своем коде

Joel Mathews 10.08.2018 17:27

Поэтому проверьте дату и время, когда пользователь отправляет страницу. Потому что, когда пользователь щелкает дату в datepicker, он фокусируется за пределами ввода, тогда ваш обработчик событий срабатывает и говорит, что «текст пуст», потому что мы не установили дату из календаря во вводе.

Majid Akbari 10.08.2018 17:34

Быстрое исправление - это замена validate_date_of_birth() на setTimeout( validate_date_of_birth, 500).

anonymous 10.08.2018 17:40
0
4
321
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку ваш код в настоящее время структурирован, события focusout и blur будут запускаться до того, как будет установлено значение $('#date-of-birth'). Он не будет запускаться снова после установки значения, если вы снова не войдете в это поле и не покинете его.

Вместо того, чтобы вызывать validate_date_of_birth() при фокусировке или размытии, рассмотрите возможность добавления функции onClose в определение datepicker с помощью логики проверки. Таким образом, проверка не будет выполняться до тех пор, пока средство выбора даты не закроется и не будет присвоено значение.

т.е.

$(function() {
    $("#date-of-birth").datepicker({
        dateFormat:'dd-mm-yy',
        changeMonth: true,
        changeYear: true,
        onClose: function(selectedDate){
            var date_of_birth=selectedDate;
            if(date_of_birth.length==''){
                $('#dob-warning-message').show();
                $('#dob-warning-message').html("Please Enter Your Date Of Birth !");
                dob_error=false;
                return false;
            }
            else{
                $('#dob-warning-message').hide();
            }
        }
    }); 
});

См. Этот вопрос для примера того, как работает onClose, или документация jQuery.

Другие вопросы по теме