WEB. Вёрстка сайтов
ФОРМЫ
jQuery Masked Input Plugin. Маска ввода для HTML элемента input
Для HostCMS
Подключаем в шапке сайта ->js('/bootstrap/js/jquery.maskedinput.min.js')
Назначение плагина masked input
-
<!-- Подключение библиотеки jQuery --> <script src="jquery.js"></script> <!-- Подключение jQuery плагина Masked Input --> <script src="jquery.maskedinput.min.js"></script>
Создание HTML маски ввода
-
Цифра 9 – соответствует цифре от 0 до 9.
-
Символ a – представляет собой любой английский символ (A-Z, a-z).
-
Знак * - представляет собой любой алфавитно-цифровой символ (A-Z, a-z, 0-9).
id="phone":<input id="phone" type="text">
<script>
//Код jQuery, установливающий маску для ввода телефона элементу input
//1. После загрузки страницы, когда все элементы будут доступны выполнить...
$(function(){
//2. Получить элемент, к которому необходимо добавить маску
$("#phone").mask("8(999) 999-9999");
});
</script>
Пример 1: 8(945) 64_-_____
<!--HTML элемент, который будет иметь заполнитель дд.мм.гггг -->
<input id="date" type="text">
<!--HTML элемент, который будет иметь в качестве заполнителя пробел -->
<input id="index" type="text">
<script>
$(function() {
//задание заполнителя с помощью параметра placeholder
$("#date").mask("99.99.9999", {placeholder: "дд.мм.гггг" });
//задание заполнителя с помощью параметра placeholder
$("#index").mask("999999", {placeholder: " " });
});
</script>
Пример 2: 15.мм.гггг
<!-- Ввод номера телефона осуществляется с помощью маски -->
<input id="phone" type="text">
<script>
$(function(){
//Использование параметра completed
$("#phone").mask("8(999) 999-9999", {
completed: function(){ alert("Вы ввели номер: " + this.val()); }
});
});
</script>
Пример 3: 6(945) 343-7667Подтвердите действие на sites.ruВы ввели номер: 6(945) 343-7667
<!-- Ввод номера телефона осуществляется с помощью маски -->
<input id="number" type="text">
<script>
jQuery(function($){
//создания своего специального символа для маски
$("#number").mask("0.9?9");
});
</script>
Пример 4: 0.2
Настройка маски ввода Masked Input
<!-- HTML элемент, имеющий маску телефона -->
<input id="number" type="text">
<script>
jQuery(function($){
//создания специального символа для маски
$.mask.definitions['~']='[+-]';
$("#number).mask("~9.99");
});
</script>
Пример 5: -5.3
<!-- HTML элемент, имеющий маску для ввода цвета в шестнадцатиричном формате -->
<input id="color" type="text">
<script>
jQuery(function($){
//создания специального символа h для маски
$.mask.definitions['h']='[A-Fa-f0-9]';
$("#color).mask("#hhhhhh");
});
</script>
Пример 6: #675a_
Пример создания маски ввода телефона
<div class="form-group">
<label for="phone">Телефон: </label>
<select id="country" class="form-control">
<option value="ru"><img src="">Россия +7</option>
<option value="ua">Украина +380</option>
<option value="by">Белоруссия +375</option>
</select>
<input id="phone" type="text" class="form-control">
</div>
<script>
jQuery (function ($) {
$(function() {
function maskPhone() {
var country = $('#country option:selected').val();
switch (country) {
case "ru":
$("#phone").mask("+7(999) 999-99-99");
break;
case "ua":
$("#phone").mask("+380(999) 999-99-99");
break;
case "by":
$("#phone").mask("+375(999) 999-99-99");
break;
}
}
maskPhone();
$('#country').change(function() {
maskPhone();
});
});
});
</script>
Пример 7Телефон:Белоруссия +375 +375(777) 6__--
JavaScript / jQuery . jquery.maskedinput.min.js
/*
jQuery Masked Input Plugin
Copyright (c) 2007 - 2015 Josh Bush (digitalbush.com)
Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license)
Version: 1.4.1
*/
!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):jQuery)}(function(a){var b,c=navigator.userAgent,d=/iphone/i.test(c),e=/chrome/i.test(c),f=/android/i.test(c);a.mask={definitions:{9:"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"},autoclear:!0,dataName:"rawMaskFn",placeholder:"_"},a.fn.extend({caret:function(a,b){var c;if(0!==this.length&&!this.is(":hidden"))return"number"==typeof a?(b="number"==typeof b?b:a,this.each(function(){this.setSelectionRange?this.setSelectionRange(a,b):this.createTextRange&&(c=this.createTextRange(),c.collapse(!0),c.moveEnd("character",b),c.moveStart("character",a),c.select())})):(this[0].setSelectionRange?(a=this[0].selectionStart,b=this[0].selectionEnd):document.selection&&document.selection.createRange&&(c=document.selection.createRange(),a=0-c.duplicate().moveStart("character",-1e5),b=a+c.text.length),{begin:a,end:b})},unmask:function(){return this.trigger("unmask")},mask:function(c,g){var h,i,j,k,l,m,n,o;if(!c&&this.length>0){h=a(this[0]);var p=h.data(a.mask.dataName);return p?p():void 0}return g=a.extend({autoclear:a.mask.autoclear,placeholder:a.mask.placeholder,completed:null},g),i=a.mask.definitions,j=[],k=n=c.length,l=null,a.each(c.split(""),function(a,b){"?"==b?(n--,k=a):i[b]?(j.push(new RegExp(i[b])),null===l&&(l=j.length-1),k>a&&(m=j.length-1)):j.push(null)}),this.trigger("unmask").each(function(){function h(){if(g.completed){for(var a=l;m>=a;a++)if(j[a]&&C[a]===p(a))return;g.completed.call(B)}}function p(a){return g.placeholder.charAt(a<g.placeholder.length?a:0)}function q(a){for(;++a<n&&!j[a];);return a}function r(a){for(;--a>=0&&!j[a];);return a}function s(a,b){var c,d;if(!(0>a)){for(c=a,d=q(b);n>c;c++)if(j[c]){if(!(n>d&&j[c].test(C[d])))break;C[c]=C[d],C[d]=p(d),d=q(d)}z(),B.caret(Math.max(l,a))}}function t(a){var b,c,d,e;for(b=a,c=p(a);n>b;b++)if(j[b]){if(d=q(b),e=C[b],C[b]=c,!(n>d&&j[d].test(e)))break;c=e}}function u(){var a=B.val(),b=B.caret();if(o&&o.length&&o.length>a.length){for(A(!0);b.begin>0&&!j[b.begin-1];)b.begin--;if(0===b.begin)for(;b.begin<l&&!j[b.begin];)b.begin++;B.caret(b.begin,b.begin)}else{for(A(!0);b.begin<n&&!j[b.begin];)b.begin++;B.caret(b.begin,b.begin)}h()}function v(){A(),B.val()!=E&&B.change()}function w(a){if(!B.prop("readonly")){var b,c,e,f=a.which||a.keyCode;o=B.val(),8===f||46===f||d&&127===f?(b=B.caret(),c=b.begin,e=b.end,e-c===0&&(c=46!==f?r(c):e=q(c-1),e=46===f?q(e):e),y(c,e),s(c,e-1),a.preventDefault()):13===f?v.call(this,a):27===f&&(B.val(E),B.caret(0,A()),a.preventDefault())}}function x(b){if(!B.prop("readonly")){var c,d,e,g=b.which||b.keyCode,i=B.caret();if(!(b.ctrlKey||b.altKey||b.metaKey||32>g)&&g&&13!==g){if(i.end-i.begin!==0&&(y(i.begin,i.end),s(i.begin,i.end-1)),c=q(i.begin-1),n>c&&(d=String.fromCharCode(g),j[c].test(d))){if(t(c),C[c]=d,z(),e=q(c),f){var k=function(){a.proxy(a.fn.caret,B,e)()};setTimeout(k,0)}else B.caret(e);i.begin<=m&&h()}b.preventDefault()}}}function y(a,b){var c;for(c=a;b>c&&n>c;c++)j[c]&&(C[c]=p(c))}function z(){B.val(C.join(""))}function A(a){var b,c,d,e=B.val(),f=-1;for(b=0,d=0;n>b;b++)if(j[b]){for(C[b]=p(b);d++<e.length;)if(c=e.charAt(d-1),j[b].test(c)){C[b]=c,f=b;break}if(d>e.length){y(b+1,n);break}}else C[b]===e.charAt(d)&&d++,k>b&&(f=b);return a?z():k>f+1?g.autoclear||C.join("")===D?(B.val()&&B.val(""),y(0,n)):z():(z(),B.val(B.val().substring(0,f+1))),k?b:l}var B=a(this),C=a.map(c.split(""),function(a,b){return"?"!=a?i[a]?p(b):a:void 0}),D=C.join(""),E=B.val();B.data(a.mask.dataName,function(){return a.map(C,function(a,b){return j[b]&&a!=p(b)?a:null}).join("")}),B.one("unmask",function(){B.off(".mask").removeData(a.mask.dataName)}).on("focus.mask",function(){if(!B.prop("readonly")){clearTimeout(b);var a;E=B.val(),a=A(),b=setTimeout(function(){B.get(0)===document.activeElement&&(z(),a==c.replace("?","").length?B.caret(0,a):B.caret(a))},10)}}).on("blur.mask",v).on("keydown.mask",w).on("keypress.mask",x).on("input.mask paste.mask",function(){B.prop("readonly")||setTimeout(function(){var a=A(!0);B.caret(a),h()},0)}),e&&f&&B.off("input.mask").on("input.mask",u),A()})}})});
Загрузка изображений через форму
Показываем превью загружаемых изображений
<label for="fileUpload" class="download-file">
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="25px" height="21px" version="1.1" viewBox="0 0 6.01 5.01"><path style="fill:#764E2B" d="M6.01 5.01l-6.01 0 0 -5.01 6.01 0 0 5.01 0 0zm-0.25 -4.76l-5.51 0 0 4.5 5.51 0 0 -4.5 0 0zm-0.25 4l-4.76 0 1 -1.87 0.75 0.76 1.26 -1.89 1.75 3zm-2.97 -0.71l-0.73 -0.74 -0.64 1.2 3.9 0 -1.33 -2.28 -1.2 1.82zm-1.16 -2.79c0.34,0 0.62,0.28 0.62,0.63 0,0.34 -0.28,0.62 -0.62,0.62 -0.35,0 -0.63,-0.28 -0.63,-0.62 0,-0.35 0.28,-0.63 0.63,-0.63zm0 0.25c0.2,0 0.37,0.17 0.37,0.38 0,0.2 -0.17,0.37 -0.37,0.37 -0.21,0 -0.38,-0.17 -0.38,-0.37 0,-0.21 0.17,-0.38 0.38,-0.38z"></path></svg>
<span class="download-file-text ps-2">Выберите несколько фото</span>
</label>
<input class="photo" type="file" name="files[]" value="" size="30" placeholder="Загрузить фото" multiple="true" accept="image" id="fileUpload" accepts=".jpg, .jpeg, .png, .webp">
<div id="image-holder" class="d-flex flex-wrap"></div>
JS для размещения в XSL-шаблон HOSTCMS
<SCRIPT>
<xsl:comment>
<xsl:text disable-output-escaping="yes">
<![CDATA[
$(function() {
$("#fileUpload").on('change', function () {
//Get count of selected files
var countFiles = $(this)[0].files.length;
var imgPath = $(this)[0].value;
var extn = imgPath.substring(imgPath.lastIndexOf('.') + 1).toLowerCase();
var image_holder = $("#image-holder");
image_holder.empty();
if (extn == "png" || extn == "jpg" || extn == "jpeg" || extn == "webp") {
if (typeof (FileReader) != "undefined") {
//loop for each file selected for uploaded.
for (var i = 0; i < countFiles; i++) {
var reader = new FileReader();
reader.onload = function (e) {
$("<img />", {
"src": e.target.result,
"class": "thumb-image"
}).appendTo(image_holder);
}
image_holder.show();
reader.readAsDataURL($(this)[0].files[i]);
}
} else {
alert("Ваш брузер не поддерживает FileReader!");
}
} else {
alert("Выберите файл в формате JPG, JPEG, PNG или WEBP!");
}
});
});
]]>
</xsl:text>
</xsl:comment>
</SCRIPT>
Добавляем поле загрузки файла (новое поле создается после загрузки изображения)
<SCRIPT>
function addOneMoreInput() {
$('input[type=file]').last().change(function() {
$(this).after('<input type="file" name="files[]" />');
$(this).off('change');
addOneMoreInput();
});
}
addOneMoreInput();
</SCRIPT>
Стили CSS
Отправка формы в новую вкладку браузера
- 1. Отдельная кнопка
- 2. Скрытая форма
Иногда возникает вопрос – как отправить HTML-форму в новую вкладку браузера, например для отдельной страницы, где будет печать введённых данных? Как и у ссылки, у элемента можно применить атрибут target(валидный только в HTML-5), который устанавливает поведение окна, при отправки формы. Возможные значения:
|
_blank
|
Загружает страницу в новое окно браузера
|
|
_self
|
Загружает страницу в текущее окно (значение по умолчанию)
|
|
_parent
|
Загружает страницу во фрейм-родитель, если фреймов нет, то это значение работает как _self
|
|
_top
|
Отменяет все фреймы и загружает страницу в полном окне браузера, если фреймов нет, то это значение работает как _self.
|
Пример:
<form action="" method="post" target="_blank">
<input type="text" name="name">
<input type="text" name="surname">
<button type="submit" name="print">Распечатать</button>
<button type="submit" name="send">Далее</button>
</form>
Минусом является то, что при нажатии любой кнопки type="submit"форма отправится в новую вкладку браузера.
1. Отдельная кнопка
Если требуется разделить события кнопок, то можно добавлять атрибут target="_blank"только при нажатии на кнопку «Распечатать» и после отправки формы его удалять с помощью JQuery.
<form action="" method="post">
<input type="text" name="name">
<input type="text" name="surname">
<button type="button" name="print">Распечатать</button>
<button type="submit" name="send">Далее</button>
</form>
<script>
$(document).ready(function(){
$("input[name='print']").click(function(){
var form = $(this).closest('form');
form.attr('target', '_blank');
form.submit();
form.attr('target', '');
});
return false;
});
</script>
2. Скрытая форма
Следующий вариант поможет, когда нужно отправить форму в новую вкладку и на другой URL. В данном примере все поля основной формы копируются в скрытую.
<form style="display: none;" action="/new.php?print=1" target="_blank" method="post" id="form-print"></form>
<form action="" method="post" id="form-original">
<input type="text" name="name">
<input type="text" name="surname">
<button type="button" name="print">Распечатать</button>
<button type="submit" name="send">Далее</button>
</form>
<script>
$(document).ready(function(){
$("input[name='print']").click(function(){
$('#form-print').html($('#form-original').html());
$('#form-print').submit();
});
return false;
});
</script>Сохраняем в сессии введённые Пользователем данные и подставляем их в поля при перезагрузке страницы
Сохраняем в сессии (sessionStorage) значения, введённые в поля формы, для сохранения их в случае перезагрузки страницы.
JavaScript
// выбираем на странице все элементы типа textarea и input
document.querySelectorAll('textarea, input').forEach(function(e) {
// если данные значения уже записаны в sessionStorage, то вставляем их в поля формы
// путём этого мы как раз берём данные из памяти браузера, если страница была случайно перезагружена
if(e.value === '') e.value = window.sessionStorage.getItem(e.name, e.value);
// на событие ввода данных (включая вставку с помощью мыши) вешаем обработчик
e.addEventListener('input', function() {
// и записываем в sessionStorage данные, в качестве имени используя атрибут name поля элемента ввода
window.sessionStorage.setItem(e.name, e.value);
});
});
ФОРМА "КУПИТЬ В 1 КЛИК" на BOOTSTRAPE

<button type="button" class="button btn-primary send-zakaz" data-item="{name}" data-bs-toggle="modal" data-bs-target="#zakazModal">
<i class="fa fa-shopping-cart"></i>
<span>Купить</span>
</button >
<div class="modal fade" id="zakazModal" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="myModalLabel">Купить в 1 клик</h4>
<button class="btn-close" type="button" data-bs-dismiss="modal"></button>
</div>
<div class="box-content">
<form method="get" class="form_call1">
<div class="row">
<div class="col-xs-12 text">
<h6>Модель: <span id="item"></span></h6>
</div>
<div class="col-xs-12 text-center mess" id="form_err1"></div>
<div class="col-xs-12 text-center mess" id="form_right1"></div>
<div class="col-xs-12">
<input id="name" maxlength="80" placeholder="Ваше Имя" type="text" />
</div>
<div class="col-xs-12">
<input id="phone" maxlength="80" placeholder="Телефон *" type="text" required/>
</div>
<div class="col-xs-12">
<button type="submit" autocomplete="off" class="zakaz-submit">Отправить заказ</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
$(function() {
$('form.form_call1').submit(function(){
phone=$('input#phone').val();
name=$('input#name').val();
reg = /^\d[\d\(\)\ -]{5,14}\d$/;
item=$('#item').text();
err='';
if (phone =='') {err+='<span>Вы не указали свой телефон</span>';}
else if (!(reg.test(phone))) {err+=' <span>Неверно указан Телефон</span>';}
if (err!='') {
$('div#form_err').html(err); // показываем ошибку
} else {
$.get( "/forms/send-zakaz.php?phone="+phone+"&name="+name+"&item="+item, function( data ) { //указываем путь к обработчику отправки формы
$('div#form_right').html(data); // показываем подтверждение удачной отправки
setTimeout(function(){
location.reload();
}, 1000);
});
}
return false;
});
$('.send-zakaz').click(function() {
var nameg = $(this).data('item');
// Добавляем в id=item название товара
$('span#item').html(nameg);
// Добавляем в дополнительное поле input название товара
$('input[name=item]').val(nameg);
});
});
PHP . Обработчик отправки фоормы
Стили CSS
Форма с валидацией (в модальном окне)
Для валидации формы используем скрипт validate.js
$(function() {
var errorTxt = 'Ошибка отправки формы'; //Ошибка отправки формы
$('#form1').validate({
rules: {
name: "required",
phone: "required"
},
messages: {
name: "Заполните это поле", // Заполните это поле
phone: "Заполните это поле",
},
focusInvalid: true,
errorClass: "input_error",
submitHandler: function(form){
var form = document.forms.form1,
formData = new FormData(form),
xhr = new XMLHttpRequest();
xhr.open("POST", "/mform/send-zakazspec.php");
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if(xhr.status == 200) {
$("#form1").html('<p style="text-align:center">Ваша Заявка отправлена!<p>');
setTimeout(function(){
location.reload();
}, 1000);
}
}
};
xhr.send(formData);
}
});
// Получаем значение из span.title и добавляем в поле формы название выбранной спецтехники
$('.predzakaz').click(function() {
var nameg = $(this).parent().children('span.title').text();
$('#predzakazModal').appendTo('body');//перемещаем по DOM в конец body
$('input#model').val(nameg);
$('#model-name').html(nameg);
});
});
HTML код формы
<div class="modal fade" id="predzakazModal" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header text-center"><button class="close" type="button" data-dismiss="modal"></button>
<div class="modal-title h3">РемонтССТ </div>
<p class="bold"> Узнать стоимость: <span id="model-name"></span></p>
</div>
<div class="box-content">
<form method="get" id="form1">
<div class="text-center mess" id="form_err1"></div>
<div class="text-center mess" id="form_right1"></div>
<input name="model" id="model" type="hidden" />
<input name="name" id="name" maxlength="80" placeholder="Ваше Имя" type="text" />
<input name="phone" id="phone" maxlength="80" placeholder="Телефон *" type="text" required/>
<button type="submit" autocomplete="off" class="btn btn-primary btn-lg btn-circle">Отправить заказ</button>
</form>
</div>
</div>
</div>
</div>
Обработчик отправки формы send-zakazspec.php
<?php
$to = "info@site.ru" ;
if ( isset( $_POST['phone'] ) ) {
$name= substr( $_POST['name'], 0, 40 );
$phone = substr( $_POST['phone'], 0, 15 );
$model = substr( $_POST['model'], 0, 250);
$body = "Имя: ".$name."\r\n";
$body .= "Телефон: ".$phone."\r\n";
$body .= "Спецтехника: ".$model."\r\n\r\n";
send_mail($to, $body, $email);
}
// Вспомогательная функция для отправки почтового сообщения с вложением
function send_mail($to, $body, $email)
{
$subject = 'Пользователь сайта SITE.RU заполнил форму Заказа спецтехники';
$boundary = "--".md5(uniqid(time())); // генерируем разделитель
$headers .= "From: ".$email."\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .="Content-Type: multipart/mixed; boundary=\"".$boundary."\"\r\n";
$multipart = "--".$boundary."\r\n";
$multipart .= "Content-type: text/plain; charset=\"utf-8\"\r\n";
$multipart .= "Content-Transfer-Encoding: quoted-printable\r\n\r\n";
$body = $body."\r\n\r\n";
$multipart .= $body;
mail($to, $subject, $multipart, $headers);
}
?>