Как сделать кнопку сабмит активной после валидации формы?
Есть скрипт, который валидирует форму. Но сейчас он прикручен к аттрибуту readonly. Мне нужно, чтобы кнопка сабмит была неактивна, пока поля формы не будут заполнены верно и не отмечен чекбокс. Как изменить этот скрипт? Код на Codepen
function addNotValidStyle(obj) {
obj.css("border", "#FF0000 1px solid");
}
function removeNotValidStyle(obj) {
obj.css("border", "");
}
function dryValidation(obj, result) {
let inputField = obj.attr('id');
if (result) {
removeNotValidStyle(obj);
obj.attr('valid', true);
$("label[for='" + inputField + "']").hide();
} else {
addNotValidStyle(obj);
obj.attr('valid', false);
$("label[for='" + inputField + "']").show();
}
}
function validateName() {
let name = $('#name-about');
let condition = (name.val() !== '');
dryValidation(name, condition);
}
function validatePhone() {
let phone = $('#phone-about');
let condition = (phone.val().length > 5);
dryValidation(phone, condition);
}
function validateCheckbox() {
let checkbox = $('#personaldata-about');
if (checkbox.prop('checked')) {
checkbox.removeClass('error-checkbox');
} else {
checkbox.addClass('error-checkbox');
}
}
function wholeValidation() {
validateName();
validatePhone();
validateCheckbox();
let name = $('#name-about');
let phone = $('#phone-about');
let result = name.attr('valid') && phone.attr('valid') && $('#personaldata-about').prop('checked');
$('#submit-about').prop('readonly', !result);
}
function manualSubmit() {
wholeValidation();
let button = $('#submit-about');
if (!button.prop('readonly')) {
$("#form-about").submit();
}
}
$(document).ready(function(){
$('#phone-about').on('blur', validatePhone);
$('#name-about').on('blur', validateName);
$('#personaldata-about').on('click', validateCheckbox);
$('#submit-about').on('click', manualSubmit);
});
/*! CSS Used from: http://wp/wp/wp-content/themes/cake-nat/style.css?ver=5.5 ; media=all */
@media all{
::-webkit-input-placeholder{font-family:'Montserrat-Regular';font-size:16px;color:#26547c;}
::-moz-placeholder{font-family:'Montserrat-Regular';font-size:16px;color:#26547c;}
::-ms-input-placeholder{font-family:'Montserrat-Regular';font-size:16px;color:#26547c;}
::placeholder{font-family:'Montserrat-Regular';font-size:16px;color:#26547c;}
input{font-family:inherit;font-size:100%;line-height:1.15;margin:0;}
input{overflow:visible;}
[type='submit']{-webkit-appearance:button;}
[type='submit']::-moz-focus-inner{padding:0;border-style:none;}
[type='submit']:-moz-focusring{outline:1px dotted ButtonText;}
[type='checkbox']{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0;}
div,span,p,form,label{font:inherit;font-size:100%;margin:0;padding:0;vertical-align:baseline;border:0;}
.button-block--loyalty{font-family:'Montserrat-Regular';font-size:16px;position:relative;top:50px;display:block;margin:auto;padding:6px 20px;text-align:center;text-decoration:none;text-transform:lowercase;color:#26547c;border:none;border-radius:20px;background-color:#ffd166;}
.button-block--loyalty:disabled{opacity:.3;}
.loyalty-form__input{width:100%;margin-top:20px;padding:8px 12px;border:1px solid #ffd166;background:transparent;}
@media (max-width: 420px){
.loyalty-form__input{width:90%;}
}
@media (max-width: 375px){
.loyalty-form__input{width:85%;}
}
.loyalty-form__input-container{position:relative;}
.loyalty-form__placeholder{font-family:'Montserrat-Medium';font-size:14px;position:absolute;z-index:-1;top:68%;left:12px;-webkit-transform:translateY(-50%);transform:translateY(-50%);color:#26547c;}
.loyalty-form__checkbox-agreem{position:absolute;z-index:-1;opacity:0;}
.loyalty-form__checkbox-agreem + label{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}
.loyalty-form__checkbox-agreem + label::before{display:inline-block;width:.9em;height:.9em;margin-right:10px;content:'';border:1px solid #06d6a0;background-repeat:no-repeat;background-position:center center;background-size:100% 100%;-ms-flex-negative:0;flex-shrink:0;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;}
.loyalty-form__checkbox-agreem:checked + label::before{background-color:#0b76ef;background-image:url('data:image/svg+xml,%3csvg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 8 8\'%3e%3cpath fill=\'%23fff\' d=\'M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z\'/%3e%3c/svg%3e');}
.loyalty-form__label-agreem{font-family:'Montserrat-Regular';font-size:12px;color:#26547c;}
.loyalty-form{padding-top:24px;padding-bottom:80px;}
.loyalty-form__pink{color:#ef476f;}
.loyalty-form__text{font-size:12px;margin:0;padding-top:15px;padding-bottom:30px;text-align:left;color:#26547c;}
.loyalty-form__input--control:focus ~ .loyalty-form__placeholder,.loyalty-form__input--control:valid ~ .loyalty-form__placeholder{display:none;}
}
/*! CSS Used fontfaces */
@font-face{font-family:'Montserrat-Regular';font-weight:normal;font-style:normal;src:url('http://wp/wp/wp-content/themes/cake-nat/assets/fonts/montserrat-v12-cyrilliclatin-regular.eot');src:url('http://wp/wp/wp-content/themes/cake-nat/assets/fonts/montserrat-v12-cyrilliclatin-regular.eot#iefix') format('embedded-opentype'), url('http://wp/wp/wp-content/themes/cake-nat/assets/fonts/montserrat-v12-cyrilliclatin-regular.otf') format('opentype'), url('http://wp/wp/wp-content/themes/cake-nat/assets/fonts/montserrat-v12-cyrilliclatin-regular.svg') format('svg'), url('http://wp/wp/wp-content/themes/cake-nat/assets/fonts/montserrat-v12-cyrilliclatin-regular.ttf') format('truetype'), url('http://wp/wp/wp-content/themes/cake-nat/assets/fonts/montserrat-v12-cyrilliclatin-regular.woff') format('woff'), url('http://wp/wp/wp-content/themes/cake-nat/assets/fonts/montserrat-v12-cyrilliclatin-regular.woff2') format('woff2');font-display:swap;}
@font-face{font-family:'Montserrat-Medium';font-weight:normal;font-style:normal;src:url('http://wp/wp/wp-content/themes/cake-nat/assets/fonts/montserrat-v12-cyrilliclatin-500.eot');src:url('http://wp/wp/wp-content/themes/cake-nat/assets/fonts/montserrat-v12-cyrilliclatin-500.eot#iefix') format('embedded-opentype'), url('http://wp/wp/wp-content/themes/cake-nat/assets/fonts/montserrat-v12-cyrilliclatin-500.otf') format('opentype'), url('http://wp/wp/wp-content/themes/cake-nat/assets/fonts/montserrat-v12-cyrilliclatin-500.svg') format('svg'), url('http://wp/wp/wp-content/themes/cake-nat/assets/fonts/montserrat-v12-cyrilliclatin-500.ttf') format('truetype'), url('http://wp/wp/wp-content/themes/cake-nat/assets/fonts/montserrat-v12-cyrilliclatin-500.woff') format('woff'), url('http://wp/wp/wp-content/themes/cake-nat/assets/fonts/montserrat-v12-cyrilliclatin-500.woff2') format('woff2');font-display:swap;}
.hidden {
display:none;
}
.loyalty-form__checkbox-agreem.error-checkbox + label
{
color: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="loyalty-content__container">
<form class="loyalty-form" id="form-about" onsubmit="alert('submit')">
<input type="hidden" value="Форма на странице о нас" name="subject">
<div class="loyalty-form__input-container">
<label for="name-about" class="hidden">Введите имя</label>
<input id="name-about" type="text"
class="loyalty-form__input loyalty-form__input--control" name="name" required
value="">
<p class="loyalty-form__placeholder">Ваше имя <span class="loyalty-form__pink">*</span>
</div>
</p>
<div class="loyalty-form__input-container">
<label for="phone-about" class="hidden">Введите номер телефона</label>
<input id="phone-about" type="tel"
class="loyalty-form__input loyalty-form__input--control" name="phone" required value="" >
<p class="loyalty-form__placeholder">Ваш мобильный телефон <span class="loyalty-form__pink">*</span>
</p>
</div>
<p class="loyalty-form__text"><span class="loyalty-form__pink">*</span> Звездочкой отмечены поля,
обязательные для
заполнения.</p>
<input id="personaldata-about" type="checkbox" required="" class="loyalty-form__checkbox-agreem"
name="check">
<label class="loyalty-form__label-agreem" for="personaldata-about">Согласен(а) на обработку моих
персональных
данных</label>
<input id="submit-about" class="button-block--loyalty" type="button" value="Отправить заявку" readonly="readonly" name="submit">
</form>
</div>
Ответы (1 шт):
Автор решения: Sergei Kirjanov
→ Ссылка
Можно использовать oninput, чтоб не ждать onblur.
Надежней по всем событиям делать wholeValidation.
Менять активность кнопки в wholeValidation по сложному условию.
(Если есть время -- написать на реакте)