06.08.2021, 13:46
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
Alex_medik,
после строки 15 пост #80 надо добавить строки 14 - 42 пост #72
уточнить только var input = document.querySelector("input");
будет что-то ... input[type='tel']
|
|
06.08.2021, 15:10
|
Новичок на форуме
|
|
Регистрация: 06.08.2021
Сообщений: 4
|
|
Удивительно ) один раз сработало и всё (((
|
|
13.08.2021, 14:44
|
Новичок на форуме
|
|
Регистрация: 13.08.2021
Сообщений: 1
|
|
Мое переосмысление кода рони.
<!DOCTYPE HTML>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type='text/css'>
.wrapper {
width: 400px;
}
.input-wrapper {
width: 200px;
margin: 10px auto;
padding: 10px;
background-color: grey;
}
.input-wrapper.completed {
background-color: green;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="input-wrapper"><input class="mask" placeholder="+7 (___) ___-__-__" type="tel" value="+7 (___) ___-__-__"></div>
<div class="input-wrapper"><input class="mask" placeholder="+7 (___) ___-__-__" type="tel" value="+7 (___) ___-__-__"></div>
</div>
<script>
window.addEventListener("DOMContentLoaded", function () {
activateMasks();
function activateMasks() {
let elems = document.querySelectorAll('input.mask');
elems.forEach(elem => {
let mask = new Mask();
elem.addEventListener("input", mask.create, false);
elem.addEventListener("focus", mask.create, false);
elem.addEventListener("click", mask.create, false);
elem.addEventListener("keydown", mask.create, false);
})
}
function Mask() {
this.completed = false;
this.create = (event) => {
let element = event.target;
let oldValue = element.value;
let caretPosition = element.selectionStart;
let isCaretInEndPosition = oldValue.substring(caretPosition).search(/\d/) === -1;
let caretMinPosition = 4; // минимально допустимая позиция каретки (не заходить на '+7 (' )
if (event.type === "keydown") {
let key = event.key;
if (key === "Backspace" && oldValue.substring(caretPosition - 1, caretPosition).search(/[\s)-]/) !== -1) {
let shift = 1; // на сколько сдвинуть каретку
if (oldValue.substring(caretPosition - 2, caretPosition) === ') ') shift = 2;
element.setSelectionRange(caretPosition - shift, caretPosition - shift);
}
if (key === "Delete" && oldValue.substring(caretPosition, caretPosition + 1).search(/[\s)-]/) !== -1) {
let shift = 1;
if (oldValue.substring(caretPosition, caretPosition + 2) === ') ') shift = 2;
element.setSelectionRange(caretPosition + shift, caretPosition + shift);
}
if (key === "ArrowLeft" && caretPosition === caretMinPosition) event.preventDefault();
if (key === "ArrowRight" && isCaretInEndPosition) event.preventDefault();
if (key === "ArrowUp") key = "Home";
if (key === "ArrowDown") key = "End";
if (key === "Home") {
element.setSelectionRange(caretMinPosition, caretMinPosition);
event.preventDefault()
}
if (key === "End") {
let caretMaxPosition = oldValue.indexOf("_");
if (caretMaxPosition !== -1) {
element.setSelectionRange(caretMaxPosition, caretMaxPosition);
event.preventDefault()
}
}
return
}
// вычисляем значение value элемента
let newValue = oldValue; // при событии focus & click значение value не меняется
if (event.type === "input") {
let matrix = "+7 (___) ___-__-__",
i = 0,
def = matrix.replace(/\D/g, ""),
val = oldValue.replace(/\D/g, "")
newValue = matrix.replace(/[_\d]/g, function (match) {
return i < val.length ? val.charAt(i++) || def.charAt(i) : match
});
element.value = newValue;
}
// определяем положение каретки
let caretMaxPosition = newValue.indexOf("_");
let isCompleted = false;// все ли цифры заполнены
if (caretMaxPosition === -1) {
caretMaxPosition = newValue.length;
isCompleted = true;
}
if (isCaretInEndPosition) {
caretPosition = caretMaxPosition
} else if (caretPosition < caretMinPosition) {
caretPosition = caretMinPosition
} else if (caretPosition > caretMaxPosition) {
caretPosition = caretMaxPosition
}
element.setSelectionRange(caretPosition, caretPosition);
// если изменилось значение completed
if (isCompleted !== this.completed) {
this.completed = !this.completed;
element.parentElement.classList.toggle('completed');
}
}
}
});
</script>
</body>
</html>
Codepen
|
|
19.08.2021, 16:20
|
Профессор
|
|
Регистрация: 08.05.2017
Сообщений: 178
|
|
Запись мобильного телефона в формате "+7 (923) 223-33-22" непригодна для отправки СМС на этот номер.
Нужно записывать и приводить к нормальному формату 7923223322.
Можно ли сразу передавать в нормальном формате значение номера телефона в тег value="7923223322"?
|
|
19.08.2021, 16:35
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
Vaska,
сделайте скрытое поле и дублируйте туда в нужном вам виде
|
|
21.10.2021, 23:51
|
Новичок на форуме
|
|
Регистрация: 21.10.2021
Сообщений: 2
|
|
Подскажите, как изменить скрипт из 5-го сообщения - так, чтобы разрешено было в 2-вариантах вводить - номер начинается либо +7, либо 8. Т.е. основной вариант остается +7, но если хотят, то удаляют +7 и пишут 8. А то сейчас, многие выделяют +7 и вставляют ctrl+v номер, начинающийся на 8 и получается +8. Соответственно, нужно в таком случае, чтобы если ctrl+v номер, начинающийся на 8 разрешить без плюса..
Последний раз редактировалось vit557, 22.10.2021 в 00:06.
|
|
22.10.2021, 07:28
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
vit557,
нужен более продуманный алгоритм, пока без вариантов.
|
|
27.10.2021, 23:44
|
Новичок на форуме
|
|
Регистрация: 21.10.2021
Сообщений: 2
|
|
Сообщение от рони
|
vit557,
нужен более продуманный алгоритм, пока без вариантов.
|
А если с плюсом не заморачиваться, его оставить в начале, а просто разрешить 8 - это реально? Кто хочет, просто удаляет 7 и пишет 8.. А я уже потом при сохранении в БД +8 заменю на 8 в начале строки
Последний раз редактировалось vit557, 27.10.2021 в 23:54.
|
|
27.10.2021, 23:57
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
vit557,
var matrix = "+_ (___) ___ ____",
|
|
06.11.2021, 09:41
|
Профессор
|
|
Регистрация: 08.05.2017
Сообщений: 178
|
|
Россия и Казахстан имеет код страны 7.
Количество цифр номера 11 для двух стран.
Контролировать ввод номеров телефона можно только по кодам операторов мобильной связи, состоящие из трех цифр.
Как вы будете с помощью только JS отделять мух от котлет?
Как запретить регистрироваться казахским номерам и разрешить только российские?
Как отделить городские номера от мобильных номеров, многие имеют одинаковое число цифр.
Нужно делать проверку кодов операторов и сверять с вводимым номером мобильного телефона.
Как вы будете делать эту проверку с JS?
По моему мнению, только JS вообще не пригоден для решения задачи с мобильными номерами телефонов.
Нужен обработчик на PHP + JS + библиотека с кодами операторов типа libphonenumber-for-php.
Последний раз редактировалось Vaska, 06.11.2021 в 14:20.
|
|
|
|