Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Добавить валидацию формы в функцию (https://javascript.ru/forum/dom-window/82641-dobavit-validaciyu-formy-v-funkciyu.html)

Vaska 05.06.2021 01:49

Добавить валидацию формы в функцию
 
Приветствую!

По мотивам формы с проверкой домена, которую сделал рони https://javascript.ru/forum/dom-wind...ssylki-2.html#, сейчас делаю такую же проверку input в форме, которая открывается в диалоговом окне.

Что сейчас есть:
На основной странице, в хедере подключены необходимые файлы скриптов, так же, внизу страницы размещен код:
function submitEditableModelForm(){
    var _form = $("#editable_model_form");
    $.ajax({
        type: "POST",
        url: _form.attr('action'),
        data: _form.serialize(),
        dataType:"json",
        success: function (res) {
                if (res.code == 10000) {
                    $('.dialog_close_button').click()
                    $('.editable-page-model[data-id='+res.result.config_id+']').replaceWith(res.result.model_html)
                    addDialogEvent()
                    initSlide()
                }else{
                    layer.msg(res.message)
                }
        }
    });
}


На этой же странице есть ссылка, которая вызывает диалоговое окно с формой ввода:
<div class='editable-page-model'>
	<form id="editable_model_form" action="/home/page/model_link">
			<input type='text' name='text[0][content]' class="text" value="text[0][content]">
			<input type='text' name='text[1][content]' class="text" value="text[1][content]">

        <span dstype="error_msg"></span>		
        <div><a class="dssc-btn" dstype="select-124" href="javascript:void(0)" onclick="submitEditableModelForm()">Отправить</a></div>
	</form>
</div>
<script>
	$(document).ready(function() {
	$('a[dstype="select-124"]').click(function () {
		$('#editable_model_form').submit();
	});

		function extractDomain(url) {
			let domain;
			//find & remove protocol (http, ftp, etc.) and get domain
			if (url.indexOf("://") > -1) {
				domain = url.split('/')[2];
                } else {
				domain = url.split('/')[0];
			}
			
			//find & remove www
			if (domain.indexOf("www.") > -1) {
				domain = domain.split('www.')[1];
			}
			
			domain = domain.split(':')[0]; //find & remove port number
			domain = domain.split('?')[0]; //find & remove url params
			
			return domain;
		}
				
		$.validator.addMethod('removeLink', function(value, element) {
			let reg = /(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|(www\.)?[a-zA-Z0-9]+\.[^\s]{2,})/mig
			let match = value.match(reg);
			return !match || match.every(link => extractDomain(link) == 'javascript.ru')
		},
		'Форма содержит запрещённые ссылки');
		$('#editable_model_form').validate({
			errorPlacement: function(error, element) {
				$('span[dstype="error_msg"]').append(error);
			},
			submitHandler: function(form) {
				ds_ajaxpost('editable_model_form');
			},
			onkeyup: false,
			rules: {
				"text[0][content]": {
					required: true,
					maxlength: 150,
					removeLink: true
				},
				"text[1][content]": {
					required: true,
					maxlength: 150,
					removeLink: true
				}

			}
		});
	});
</script>


Если скрипт видит в поле input сторонний домен, то показывает сообщение 'Форма содержит запрещённые ссылки'. Это работает.
Однако нажав на кнопку отправить - сообщение успешно отправляется, хотя отправляться не должно, по задумке.
Кнопка Отправить имеет в своём коде onclick="submitEditableModelForm()".
Значит проверка проходит неправильно. Видимо проверку валидации поля нужно проводить и в функции submitEditableModelForm(), код которой расположен за пределами диалогового окна, на основной странице.
Но я не знаю как это сделать.
Можете помочь сделать проверку валидации для функции submitEditableModelForm(), если в этом причина?

рони 05.06.2021 08:10

Vaska,
код 2 строка 13 добавить в начало
if($('#editable_model_form').valid())

Vaska 05.06.2021 13:27

Цитата:

Сообщение от рони (Сообщение 537696)
Vaska,
код 2 строка 13 добавить в начало
if($('#editable_model_form').valid())

Добавил, не помогло:
$('a[dstype="select-124"]').click(function () {
	if($('#editable_model_form').valid());
	$('#editable_model_form').submit();
	});

Форма всё равно отправляется.

Vaska 05.06.2021 15:36

Пробовал так и не получилось:
$(function(){$("a[dstype="select-124"]").click(function(){
	if($("#editable_model_form").valid()){
	$('#editable_model_form').submit();
	}
    });
    });


$('a[dstype="select-124"]').click(function () {
	if($("#editable_model_form").valid()){
	$('#editable_model_form').submit();
	}
	});


var SUBMIT_FORM = true;
$('a[dstype="select-124"]').on('click',function(){
if (!$("#editable_model_form").valid()) return;
if (!SUBMIT_FORM) return;
SUBMIT_FORM = false;
$('#editable_model_form').submit();
});


Я думаю, что нужно убрать из кнопки onclick="submitEditableModelForm()"
<a class="dssc-btn" dstype="select-124" href="javascript:void(0)" onclick="submitEditableModelForm()">Отправить</a>


И оставить такую кнопку:
<a class="dssc-btn" dstype="select-124" href="javascript:void(0)">Отправить</a>

Далее сделать условие, что если при нажатии кнопки Отправить валидация проходит успешно,тогда передавать submit в функцию submitEditableModelForm(), чтобы форма отправлялась. А если не проходит, тогда не передавать.
Как бы это ещё сделать?

рони 05.06.2021 16:24

Vaska,
вопрос вы два раза форму шлёте на сервер?
клик убрать из 12 строки
в строку 49 добавить
onsubmit: false,


в function submitEditableModelForm() добавить проверку
if(_form.valid()) $.ajax({

Vaska 05.06.2021 16:36

Цитата:

Сообщение от рони (Сообщение 537704)
Vaska,
вопрос вы два раза форму шлёте на сервер?

if(_form.valid()) $.ajax({

Получается два раза.
Как сделать один раз, исходя из имеющегося кода?

Первый код нельзя убрать из основного файла странице, к нему обращаются много файлов диалоговых окон.

рони 05.06.2021 16:44

Цитата:

Сообщение от Vaska
Как сделать один раз, исходя из имеющегося кода?

смотри пост #5

Vaska 05.06.2021 17:08

рони,
Я удалил полностью строку 12, 13, 14. Сабмит же выполняет функция submitEditableModelForm().
Далее добавил условие как вы написали
if(_form.valid()) $.ajax({


Теперь всё хорошо работает.
Большое спасибо!


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