Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Не работает валидация в модальном окне (https://javascript.ru/forum/jquery/78325-ne-rabotaet-validaciya-v-modalnom-okne.html)

fines179 27.08.2019 08:42

Не работает валидация в модальном окне
 
Задача: создать таблицу, при нажатии на кнопку появляется модальное окно с формой, данные при заполнении которой, в последующем попадут в эту таблицу.
Пользуюсь плагинами jQuery UI и jQuery validation,
при вызове модального окна через jQuery UI не работает валидация. Пишет при проверке валидности формы "if($('#dialogForm').valid() {}" "форма undefined". Да и вообще валидация внутри формы не работает. Также не работает сброс формы "reset". по отдельности валидация и модальное окно работают хорошо, а вместе никак

вот код
$('#dialogForm').validate({
		
		onsubmit: false,
		
		rules: {
			form_name_сlient: {
				required: true,
				minlength: 3
			},

			form_number_сlient: {
				number: true,
				required: true
			},

			form_data: {
				required: true,
				date: true
			},

			type_appeal: {
				required: true,
			}
		},

		messages: {
			form_name_сlient: {
				required: 'Поле обязательно для заполнения',
				minlength: 'Имя не короче 3х символов'
			},

			form_number_сlient: {
				number: 'Поле заполнено некооректно',
				required: 'Поле обязательно для заполнения'
			},

			form_data: {
				required: 'Поле обязательно для заполнения',
				date: 'Поле заполнено некооректно'
			},

			type_appeal: {
				required: 'Поле обязательно для заполнения'
			}
		},
		
	});
	
	let table = $('table')[0];
	let mesh = $('#dialog_window input');
	
	let appealDialog = $('#dialog_window').dialog({
		autoOpen: false,
		modal: true,
		buttons: {
		
			'Добавить': function() {  
				//if($('#dialogForm').valid()){ не работает 
				   $(`<tr><td>${mesh[0].value}</td>
				   <td>${mesh[1].value}</td>
				   <td>${mesh[2].value}</td>
				   <td>${$("[name='type_appeal']").val()}</td>
				    </tr>`).appendTo(table);
				//}
				$('#dialogForm')[0].reset();//тоже
				$(this).dialog( "close" );
			},

			'Удалить': function() {
				$('#dialogForm')[0].reset();
				$(this).dialog( "close" );
			},
		}
		
	});
	
	$('#appeal').click(function(e) {
		appealDialog.dialog('open');
	});

рони 27.08.2019 08:46

fines179,
Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

fines179 27.08.2019 08:55

Спасибо)

рони 27.08.2019 09:32

fines179,
вы что-то не договариваите, всё работает.
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
  <script src="http://jqueryvalidation.org/files/dist/jquery.validate.js"></script>
  <script>
$(function() {
$('#dialogForm').validate({

		onsubmit: false,

		rules: {
			form_name_сlient: {
				required: true,
				minlength: 3
			},

			form_number_сlient: {
				number: true,
				required: true
			},

			form_data: {
				required: true,
				date: true
			},

			type_appeal: {
				required: true,
			}
		},

		messages: {
			form_name_сlient: {
				required: 'Поле обязательно для заполнения',
				minlength: 'Имя не короче 3х символов'
			},

			form_number_сlient: {
				number: 'Поле заполнено некооректно',
				required: 'Поле обязательно для заполнения'
			},

			form_data: {
				required: 'Поле обязательно для заполнения',
				date: 'Поле заполнено некооректно'
			},

			type_appeal: {
				required: 'Поле обязательно для заполнения'
			}
		},

	});

	let table = $('table');
	let mesh = $('#dialog_window input');

	let appealDialog = $('#dialog_window').dialog({
		autoOpen: false,
		modal: true,
		buttons: {

			'Добавить': function() {
				if($('#dialogForm').valid()){
				   $(`<tr><td>${mesh[0].value}</td>
				   <td>${mesh[1].value}</td>
				   <td>${mesh[2].value}</td>
				   <td>${$("[name='type_appeal']").val()}</td>
				    </tr>`).appendTo(table);
				}
				$('#dialogForm')[0].reset();//тоже
				$(this).dialog( "close" );
			},

			'Удалить': function() {
				$('#dialogForm')[0].reset();
				$(this).dialog( "close" );
			},
		}

	});

	$('#appeal').click(function(e) {
		appealDialog.dialog('open');
	});

});
  </script>
</head>

<body>
<table>
</table>
<div id="dialog_window">
<form action="http://"  id="dialogForm">
<input name="form_name_сlient" placeholder="для теста">
<input name="">
<input name="">
<input name="">
</form></div>
<button id="appeal">appeal</button>
</body>
</html>

fines179 27.08.2019 09:38

возможно дело в подключении стилей и html-коде, но вроде как все хорошо

<!DOCTYPE HTML>
<html>
	<head> 
		<meta charset="utf-8">
		<link rel="stylesheet" href="jquery-ui-1.12.1/jquery-ui.css">
	</head>
	<body>
		<table border="1" width="100%" cellpadding="10">
			<h2>Написать обращение</h2>
			<tr>
				<th>
					Имя клиента
				</th>
				<th>
					Телефон
				</th>
				<th>
					Дата обращения
				</th>
				<th>
					тип обращения: вопрос, жалоба, благодарность.
				</th>
			</tr>
		</table>
		<div id='dialog_window' title='Новое обращение'>
			<form name='dialogForm'>
				<input type='text' name='form_name_сlient' placeholder="Введите имя">
				<input type='number' name='form_number_сlient' placeholder='Введите номер телефона'>
				<input type='data' name='form_data' placeholder="дата">
				<select name='type_appeal'>
					<option>
						Вопрос
					</option>
					<option>
						Жалоба
					</option>
					<option>
						Благодарность
					</option>
				</select>
			</form>
		</div>
		<button type='button' id='appeal'>
			Новое обращение
		</button>
		<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js" defer></script>
		<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.1/jquery.validate.js" defer></script>
		<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.1/jquery.validate.min.js" defer></script>
		<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.1/additional-methods.js" defer></script>
		<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.1/additional-methods.min.js" defer></script>
		<script src="../../jquery-ui-1.12.1/jquery-ui.js" defer></script>
		<script src='task21.js' defer></script>
	</body>	
</html>

рони 27.08.2019 09:54

fines179,
не грузите скрипты дважды!!!
выберите что-то одно, или сжатую версию(min.js) или "полную" (.js) строки 47 - 50

fines179 27.08.2019 10:16

Цитата:

Сообщение от рони (Сообщение 512240)
fines179,
не грузите скрипты дважды!!!
выберите что-то одно, или сжатую версию(min.js) или "полную" (.js) строки 47 - 50

все равно не работает
на reset - Cannot read property 'reset' of undefined;
на валидации - Cannot read property 'form' of undefined

рони 27.08.2019 10:45

fines179,
где id в форме?
Цитата:

Сообщение от fines179
$('#dialogForm')[


fines179 27.08.2019 11:06

Цитата:

Сообщение от рони (Сообщение 512243)
fines179,
где id в форме?

О, спасибо!:D


Часовой пояс GMT +3, время: 23:25.