Форма обратной связи с «капчей» на jQuery

Дата публикации: 30 Ноя 2016г.

Задача:

Во всплывающем окне, выводить форму обратной связи, с валидацией, плюс защита от спама (аналог капчи, только проще)

В продолжении темы раскрытой в посте всплывающее окно на jQuery, сделаем в этом окне стандартную форму обратной связи

Пишим разметку формы обратной связи на HTML5 с валидацией обязательных полей, и проверки поля "Телефон" регуляркой, которая позволяет вводить номера РФ. Защиту от спама организуем чекбоксом, без клика по которому письмо не будет отправлено. Итак HTML разметка:

<form method="post" action="feedback.php" id="contactform">
 
<h6>Обратная связь</h6>
 
<input type="text" required="" placeholder="Имя*" name="txtname">
 
<input type="tel" pattern="^((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}$" required="" placeholder="Телефон*" name="txtphone">
 
<p class="phoneFormat">формат +7 XXX XXX XX XX</p>
 
<input type="email" placeholder="Email" name="txtemail">
 
<textarea name="message" placeholder="Описание" rows="10" value=""></textarea>
 
<input type="hidden" name="valTrFal" class="valTrFal" value="valTrFal_disabled">
 
<input type="checkbox" id="checkBoxId"><label for="checkBoxId">- для отправки сообщения поставте галочку</label>
 
<input type="submit" class="button" value="Подобрать" disabled="disabled" name="btnsend">
</form>

CSS для оформления формы

.overlay {
    background-color: rgba(0, 0, 0, 0.7);
    bottom: 0;
    cursor: default;
    left: 0;
    opacity: 0;
    position: fixed;
    right: 0;
    top: 0;
    visibility: hidden;
    z-index: 99999;
		-webkit-transition: opacity .5s;
		-moz-transition: opacity .5s;
		-ms-transition: opacity .5s;
		-o-transition: opacity .5s;
		transition: opacity .5s;
}
.popup {
	background-color: #fff;
	border: 3px solid #fff;
	display: inline-block;
	left: 50%;
	opacity: 0;
	padding: 15px;
	width: 300px;
	height: 323px;
	position: fixed;
	text-align: justify;
	top: 40%;
	visibility: hidden;
	z-index: 999999;
	-webkit-transform: translate(-50%, -50%);
	-moz-transform: translate(-50%, -50%);
	-ms-transform: translate(-50%, -50%);
	-o-transform: translate(-50%, -50%);
	transform: translate(-50%, -50%);
	-webkit-transition: opacity .5s, top .5s;
	-moz-transition: opacity .5s, top .5s;
	-ms-transition: opacity .5s, top .5s;
	-o-transition: opacity .5s, top .5s;
	transition: opacity .5s, top .5s;
	border-radius: 11px;
}
.popup .close_order {
	font-size: 13px;
	display: block;
	width: 6px;
	height: 17px;
	position: absolute;
	padding: 1px 9px 4px 9px;
	top: -15px;
	right: -15px;
	cursor: pointer;
	color: #fff;
	font-family: 'tahoma', sans-serif;
	background: -webkit-gradient(linear, left top, right top, from(#3d51c8), to(#051fb8));
	background: -webkit-linear-gradient(top, #3d51c8, #051fb8);
	background: -moz-linear-gradient(top, #3d51c8, #051fb8);
	background: -o-linear-gradient(top, #3d51c8, #051fb8);
	background: -ms-linear-gradient(top, #3d51c8, #051fb8);
	background: linear-gradient(top, #3d51c8, #051fb8);
	background-color: #3d51c8;
	border: 1px solid #061fb8;
	-webkit-border-radius: 50%;
	-moz-border-radius: 50%;
	-o-border-radius: 50%;
	-ms-border-radius: 50%;
	border-radius: 50%;
	text-align: center;
	box-shadow: -1px 1px 3px rgba(0, 0, 0, 0.5);
}
.popup .close_order:hover {
	background: -webkit-gradient(linear, left top, right top, from(#051fb8), to(#3d51c8));
	background: -webkit-linear-gradient(top, #051fb8, #3d51c8);
	background: -moz-linear-gradient(top, #ff5f0, #3d51c87);
	background: -o-linear-gradient(top, #051fb8, #3d51c8);
	background: -ms-linear-gradient(top, #051fb8, #3d51c8);
	background: linear-gradient(top, #051fb8, #3d51c8);
	background-color: #051fb8;
	border: 1px solid #00385E;
}
.popup .close_order:active {
	background: #8f9be0;
}
#contactform input[type="email"], #contactform input[type="tel"], #contactform input[type="text"] {
	font-size: 15px;
	border: 1px solid #ccc;
	padding: 0px 7px;
	margin: 0;
	border-radius: 2px;
	-moz-border-radius: 2px;
	-webkit-border-radius: 2px;
	text-shadow: #BBBBBB 0px 1px 2px;
	height: 25px;
	text-align: left;
	-moz-box-shadow: inset 1px 1px 4px #ccc;
	-webkit-box-shadow: inset 1px 1px 4px #ccc;
	box-shadow: inset 1px 1px 4px #ccc;
	margin: 5px;
	width: 90%;
}
#contactform textarea{
	resize: none;
	font-family: 'arial', sans-serif;
	padding: 6px;
	width: 271px;
	height: 80px;
	font-size: 15px;
	border: 1px solid #ccc;
	border-radius: 2px;
	-moz-border-radius: 2px;
	-webkit-border-radius: 2px;
	text-shadow: #BBBBBB 0px 1px 2px;
	text-align: left;
	-moz-box-shadow: inset 1px 1px 4px #ccc;
	-webkit-box-shadow: inset 1px 1px 4px #ccc;
	box-shadow: inset 1px 1px 4px #ccc;
	margin: 5px;
}
#contactform input[type="checkbox"] {
	float: left;
}
.popup #contactform {
	position: relative;
	border-radius: 12px;
	background: none;
}
#contactform h6 {
	display: block;
	font-size: 16px;
	margin: 5px;
}
#contactform .button{
	background: -webkit-gradient(linear, left top, right top, from(#3d51c8), to(#051fb8));
	background: -webkit-linear-gradient(top, #3d51c8, #051fb8);
	background: -moz-linear-gradient(top, #3d51c8, #051fb8);
	background: -o-linear-gradient(top, #3d51c8, #051fb8);
	background: -ms-linear-gradient(top, #3d51c8, #051fb8);
	background: linear-gradient(top, #3d51c8, #051fb8);
	background-color: #3d51c8;
	-webkit-border-radius: 4px;
	-moz-border-radius: 4px;
	-o-border-radius: 4px;
	-ms-border-radius: 4px;
	border-radius: 4px;
	text-shadow: 1px 0px 1px rgba(34, 36, 36, .75);
	border: 1px solid #061fb8;
	color: #ffffff;
	display: block;
	font-size: 14px;
	font-weight: bold;
	width: 98px;
	padding: 6px;
	outline: medium none;
	text-align: center;
	vertical-align: middle;
	margin: 10px auto;
	text-decoration: none;
	cursor: pointer;
	box-shadow: -1px 1px 3px rgba(0, 0, 0, 0.5);
}
#contactform .button:hover {
	background: -webkit-gradient(linear, left top, right top, from(#051fb8), to(#3d51c8));
	background: -webkit-linear-gradient(top, #051fb8, #3d51c8);
	background: -moz-linear-gradient(top, #ff5f0, #3d51c87);
	background: -o-linear-gradient(top, #051fb8, #3d51c8);
	background: -ms-linear-gradient(top, #051fb8, #3d51c8);
	background: linear-gradient(top, #051fb8, #3d51c8);
	background-color: #051fb8;
	border: 1px solid #00385E;
	text-decoration: none;
}
#contactform .button:active, #contactform input[type="submit"].button:disabled {
	opacity: 0.5;
	background: -webkit-gradient(linear, left top, right top, from(#3d51c8), to(#051fb8));
	background: -webkit-linear-gradient(top, #3d51c8, #051fb8);
	background: -moz-linear-gradient(top, #3d51c8, #051fb8);
	background: -o-linear-gradient(top, #3d51c8, #051fb8);
	background: -ms-linear-gradient(top, #3d51c8, #051fb8);
	background: linear-gradient(top, #3d51c8, #051fb8);
	background-color: #3d51c8;
	cursor: default;
}
#contactform .phoneFormat {
	line-height: 12px;
	font-size: 12px;
	color: #cacaca;
	position: relative;
	z-index: 20;
	padding: 0;
	margin: 2px;
}
#contactform label {
	font-family: Arial, Helvetica, sans-serif;
	font-size: 13px;
}

Далее сам скрипт:

Не забываем подключить библиотеку jQuery

<script type="text/javascript">
 
$(document).ready(function(){
 
$('.popup .close_order, .overlay').click(function (){
 
 
$('.popup, .overlay').css({'opacity':'0','visibility':'hidden'});
 
 
$('#contactform input:checkbox').removeAttr("checked");
 
 
$("#contactform input[type=submit]").attr('disabled','disabled');
 
 
$('#contactform input[type=hidden].valTrFal').val('valTrFal_disabled');
 
});
 
$('a.clickMe').click(function (e){
 
 
$('.popup, .overlay').css('opacity','1');
 
 
$('.popup, .overlay').css('visibility','visible');
 
 
e.preventDefault();
 
});
 
$(function () {
 
 
$('#contactform input:checkbox').change(function() {
 
 
if($(this).is(':checked')){
 
 
 
$("#contactform input[type=submit]").removeAttr('disabled');
 
 
 
$('#contactform input[type=hidden].valTrFal').val('valTrFal_true');
 
 
}
 
 
else {
 
 
 
$("#contactform input[type=submit]").attr('disabled','disabled');
 
 
 
$('#contactform input[type=hidden].valTrFal').val('valTrFal_disabled');
 
 
}
 
 
});
 
});
 
});
</script>

В архиве лежит файл php в нем указываем кодировку письма, и почту получателя. Этот файл тоже проверяет отмечен ли чек бокс. Как это происходит? Можно было заметить, что в разметке формы существует скрытое поле <input type="hidden" name="valTrFal" class="valTrFal" value="valTrFal_disabled">, его значение при клике на чек боксе меняется на "valTrFal_true". При отправке запроса на сервер, в коде php проверяется значение этого скрытого поля, если оно не равно "valTrFal_true", то сообщение не отправляется, а пользователь перенаправляется на страницу notsendmessage, если же значение скрытого поля равно "valTrFal_true", то письмо отправляется, и происходит переадресация пользователя на страницу sendmessage.


Как сделать AJAX форму обратной связи