jQuery Masked Input Plugin. Маска ввода для HTML элемента input

Для HostCMS

Подключаем в шапке сайта   ->js('/bootstrap/js/jquery.maskedinput.min.js')

$("input[name=phone]").mask("+7 (999) 999-9999");

Назначение плагина masked input

Плагин masked input предназначен для установления маски ввода элементу input с помощью кода JavaScript. Данный плагин для своего функционирования требует наличие подключённой библиотеки jQuery. Скачать плагин jquery.maskedinput.js (jquery.maskedinput.min) можно посредством следующей ссылки:
Подключение плагина
После того как Вы скачали этот плагин (файл js), его необходимо подключить. Это осуществляется с помощью элемента script:
  1. <!-- Подключение библиотеки jQuery -->
    <script src="jquery.js"></script>
    <!-- Подключение jQuery плагина Masked Input -->
    <script src="jquery.maskedinput.min.js"></script>

Создание HTML маски ввода

Создания маски ввода осушествляется в js коде с помощью следующих знаков:
  • Цифра 9 – соответствует цифре от 0 до 9.
  • Символ a – представляет собой любой английский символ (A-Z, a-z).
  • Знак * - представляет собой любой алфавитно-цифровой символ (A-Z, a-z, 0-9).
Например рассмотрим процесс создания маски ввода телефона для элемента input, имеющего id="phone":
<input id="phone" type="text">
<script>
//Код jQuery, установливающий маску для ввода телефона элементу input
//1. После загрузки страницы, когда все элементы будут доступны выполнить...
$(function(){
//2. Получить элемент, к которому необходимо добавить маску
$("#phone").mask("8(999) 999-9999");
});
</script>
Создание HTML элементу input маски ввода телефона
Пример 1:    8(945) 64_-_____
Внимание: По умолчанию в качестве заполнителя маски используется знак нижнего подчеркивания ('_').
Если в качестве заполнителя Вы хотите использовать что-то другое, то его можно указать посредством параметра placeholder следующим образом:
<!--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>
Использование различных заполнителей в масках ввода masked input
Пример 2:  15.мм.гггг
Кроме placeholder данный плагин имеет ещё параметр completed. Он предназначен для задания действий, которые будут выполнятся после того как пользователь завершит ввод маски ввода.
Например, выведем с помощью метода alert сообщение пользователю, когда он завершит ввод маски телефона:
<!-- Ввод номера телефона осуществляется с помощью маски -->
 <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
Иногда бывают такие ситуации, когда одна часть маски является обязательной для заполнения, а другая часть нет. Чтобы это указать, в Masked Input используется знак '?'. Этот знак является специальным символом, после которого необходимо разместить часть маски необязательной для заполнения.
Например, пользователю необходимо ввести число от 0 до 0.99. При этом обязательным для заполнения является указание хотя бы одного знака после запятой.
<!-- Ввод номера телефона осуществляется с помощью маски -->
<input id="number" type="text">
<script>
jQuery(function($){
 //создания своего специального символа для маски
$("#number").mask("0.9?9");
 });
</script>
Демонстрация работы маски для ввода числа с одним или двумя знаками после запятой
Пример 4:  0.2

Настройка маски ввода Masked Input

Плагин Masked Input позволяет использовать в маске кроме предопределенных специальных знаков (9a*) свои собственные.
Например, создадим для маски специальный символ ~, который при вводе должен быть заменён на знак (+) или минус (-).
<!-- HTML элемент, имеющий маску телефона -->
<input id="number" type="text">
<script>
jQuery(function($){
//создания специального символа для маски
$.mask.definitions['~']='[+-]';
$("#number).mask("~9.99");
});
</script>
Демонстрация работы маски для ввода положительного или отрицательного числа
Пример 5:   -5.3
Например, создадим маску для ввода CSS цвета в шестнадцатеричном формате:
<!-- HTML элемент, имеющий маску для ввода цвета в шестнадцатиричном формате -->
<input id="color" type="text">
<script>
jQuery(function($){
//создания специального символа h для маски
$.mask.definitions['h']='[A-Fa-f0-9]';
$("#color).mask("#hhhhhh");
});
</script>
Демонстрация работы маски для ввода цвета CSS в шестандцатиричном формате
Пример 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

.download-file {
cursor: pointer
}
#image-holder {
margin-top: 10px
}
#image-holder img {
margin: 2px;
border: 2px solid rgba(120,79,43,0.5);
max-height: 50px !important
}
input.photo {
position: absolute;
width: 1px;
height: 1px;
margin: -1px;
border: 0;
padding: 0;
clip: rect(0 0 0 0);
overflow: hidden
}
.form-check, .download-file-text {
color: #764E2B;
font-size: 13px
}

Отправка формы в новую вкладку браузера

Отправка формы в новую вкладку браузера
Содержание
  1. 1. Отдельная кнопка
  2. 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

Кнопка вызова формы - добавляем в карточку товара или в каталог товаров
HTML
<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 >
HTML. Код формы
<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>
Валидация формы на jQuery
$(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 . Обработчик отправки фоормы

<?php
//несколько ящиков перечисляются через запятую
$to = "zakaz@site.ru" ;
if( $_GET['phone'] ) {
$subject = "Заказ на сайте SITE.RU";
$message = '
<p>Пользователь сайта SITE.RU заполнил форму Заказа в 1 клик:<br/>
<strong>Имя: </strong>'.$_GET['name'].'<br/>
<strong>Телефон: </strong>'.$_GET['phone'].'<br/>
<strong>Товар: </strong>'.$_GET['item'].'
</p>
';
$headers = "Content-type: text/html; charset=utf-8 \r\n";
$headers .= "From: zakaz@site.ru\r\n";
mail($to, $subject, $message, $headers);
//header('Content-Type: application/json');
}
?>
<span>Заказ успешно отправлен!</span>

Стили CSS

.modal-content {border-radius: 13px; box-shadow: 0 0 12px rgba(0,0,0,.2); position: relative!important; width:100%; max-width: 600px!important; background: #fff!important; border: 3px solid rgb(251,119,3)!important; padding: 20px; margin: 3% auto!important;}
.modal-header {padding: 0 0 10px;}
.modal-header .close { background: url(/images/close.png) no-repeat; display:inline-block; padding: 25px 25px 0 0!important; opacity:.7; }
.modal-header h4 {padding: 20px 55px 0; font-size: 32px!important; font-weight:300;}
.modal-content h6 {font-size: 18px!important; font-weight: 600!important; color:#666; margin: 19px 0 35px!important;}
.modal-content .box-content {padding: 0 55px;}
.modal-content input {
float: left!important;
height: 40px!important;
color: #b4b4b4!important;
font-size: 16px!important;
border: 2px solid #b4b4b4!important;
border-radius: 3px!important;
padding: 0 7px!important;
}
.modal-content button[type="submit"] {
float: left!important;
height: 44px;
position: inherit!important;
background: url(/images/button_icon.png) 0 50% no-repeat;
background-color: rgb(251,119,3)!important;
color: #fff!important;
font-size: 18px!important;
font-weight: 100!important;
border: none!important;
cursor: pointer!important;
padding: 0 17px 0 46px!important;
}
.modal-content input, .modal-content button[type="submit"] {margin: 20px 0; width:100%;}

Форма с валидацией (в модальном окне)

Для валидации формы используем скрипт 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);
}
?>