5

Как правильно подправить скрипт маски телефона? А именно, как сделать, чтобы закрывающая скобка появлялась после ввода третьей цифры, а не четвертой? И еще, возможно ли выделить "+7" другим цветом?

window.addEventListener("DOMContentLoaded", function() {
function setCursorPosition(pos, elem) {
    elem.focus();
    if (elem.setSelectionRange) elem.setSelectionRange(pos, pos);
    else if (elem.createTextRange) {
        var range = elem.createTextRange();
        range.collapse(true);
        range.moveEnd("character", pos);
        range.moveStart("character", pos);
        range.select()
    }
}

function mask(event) { var matrix = "+7 (___) ___ ____", i = 0, def = matrix.replace(/\D/g, ""), val = this.value.replace(/\D/g, ""); if (def.length >= val.length) val = def; this.value = matrix.replace(/./g, function(a) { return /[_\d]/.test(a) && i < val.length ? val.charAt(i++) : i >= val.length ? "" : a }); if (event.type == "blur") { if (this.value.length == 2) this.value = "" } else setCursorPosition(this.value.length, this) }; var input = document.querySelector("#tel"); input.addEventListener("input", mask, false); input.addEventListener("focus", mask, false); input.addEventListener("blur", mask, false); });

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="tel">
Kromster
  • 13,809
Sevastopol'
  • 28,195
  • Выделить другим цветом - никак. в input не предусмотрены теги html. А насчет скобки могу написать ответ. –  Oct 01 '17 at 10:15
  • Но если вам прям так необходимо выделить цветом можно воспользоватся contenteditable. –  Oct 01 '17 at 10:17
  • Ну, очевидно, что что бы заменить постановку скобки достаточно заменить "+7 (___) ___ ____" на скажем "+7 (__) ____ ____" – MedvedevDev Oct 01 '17 at 10:52
  • https://habrahabr.ru/post/37249/ – soft87 Oct 04 '17 at 17:05

2 Answers2

4

Вот то что вы хотели:

window.addEventListener("DOMContentLoaded", function() {
function setCursorPosition(pos, elem) {
    elem.focus();
    if (elem.setSelectionRange) elem.setSelectionRange(pos, pos);
    else if (elem.createTextRange) {
        var range = elem.createTextRange();
        range.collapse(true);
        range.moveEnd("character", pos);
        range.moveStart("character", pos);
        range.select()
    }
}

var is_del = false; var is_back = false; function mask(event) { var curent_position = -1; if(event.type == "keyup"){ curent_position = this.selectionStart; } var matrix = "+7 (___) ___ ____", i = 0, def = matrix.replace(/\D/g, ""), val = this.value.replace(/\D/g, ""); if (def.length >= val.length) val = def; this.value = matrix.replace(/./g, function(a) { return /[_\d]/.test(a) && i <= val.length ? val.charAt(i++) : i < val.length ? a : i++ == 6 && val.length == 4 && event.keyCode !=8 && event.keyCode !='' ? ")" : "" }); is_back = is_del = false; if(event.keyCode == 8) is_back = true; else if(event.keyCode == 46) is_del = true; if (event.type == "blur") { if (this.value.length == 2) this.value = ""; } else if(curent_position != -1){ if(is_del || is_back){ setCursorPosition(curent_position, this); } } else if(event.type == "focus") setCursorPosition(this.value.length, this); }; var input = document.querySelector("#tel"); input.addEventListener("focus", mask, false); input.addEventListener("blur", mask, false); input.addEventListener("keyup", mask, false); });

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="tel">

У вас эта строка была немного не доделано:

return /[_\d]/.test(a) && i < val.length ? val.charAt(i++) : i >= val.length ? "" : a:

Немного изменил код, для позиции курсора, который вы в комментариях написали. Теперь курсор на месте остается.

Raz Galstyan
  • 8,258
  • @LADYX сейчас посмотрю это, а то что другим цветом, ответ дал @Qwertiy. посмотрите на этот вариант, если не устраивает то нечем сейчас не могу помочь, потому что я вообще не знаю вариант (как я знаю не возможно) перекрасить часть текста в input. – Raz Galstyan Oct 04 '17 at 10:25
  • @RazmikGalstyan, я его просто сверху прикрыл спаном с тем же текстом. А вообще, можно что-то с наложением маски попробовать, но не уверен, что выйдет. – Qwertiy Oct 04 '17 at 10:38
  • @LADYX и RazmikGalstyan, кстати, как-то сложно с setCursorPosition - посмотрите более простой вариант: https://ru.stackoverflow.com/a/687383/178988 – Qwertiy Oct 04 '17 at 10:40
  • @LADYX Изменил ответ, теперь курсор возвращается на место. – Raz Galstyan Oct 04 '17 at 11:01
  • @LADYX, я потом отвечу, если не забуду и время будет... – Qwertiy Oct 04 '17 at 12:35
  • @LADYX Добавил del то же. – Raz Galstyan Oct 04 '17 at 12:44
  • @RazmikGalstyan, сомнительно добавил - курсор прыгает в начало. – Qwertiy Oct 04 '17 at 12:54
  • @Qwertiy Я смотрю у меня нет такого точно. – Raz Galstyan Oct 04 '17 at 12:56
  • @RazmikGalstyan, да, кажется, что-то ещё поменялось или глючило. А теперь попробуй удалить цифру в середине и на том же месте написать другую - курсор отправится в конец. – Qwertiy Oct 04 '17 at 13:06
  • @Qwertiy Да я знаю что это так, после добавления цифры. По этому поводу автор нечего не сказал да же в комментариях. – Raz Galstyan Oct 04 '17 at 13:07
  • @LADYX Я посмотрю что с ним не так, но сегодня уже могу не успеть)))) – Raz Galstyan Oct 04 '17 at 16:06
  • @LADYX Поправил и это, сейчас на мой взгляд работает корректно, во всех случаях. – Raz Galstyan Oct 04 '17 at 16:58
  • @LADYX Все возможно, постараюсь убрать эти моменты – Raz Galstyan Oct 05 '17 at 10:47
3

По поводу выделения цветом:

label {
  position: relative;
}

span, input { /* Chrome defaults for input on Windows */ border-width: 2px; padding: 1px 0; font-family: Arial; font-size: 13.3333px; }

span { border-style: solid; border-color: transparent; pointer-events: none; color: red; background: white; background-clip: content-box; }

span { position: absolute; }

<label><span>+7</span><input type="text" id="tel" value="+7 (123) 456 78 90"></label>

По поводу скобки:

var matrix = "+7 (____) __ ____",
Qwertiy
  • 123,725
  • @LADYX, видимо, неправильно второй вопрос понял. https://ru.stackoverflow.com/a/687383/178988 - может, поможет. – Qwertiy Oct 04 '17 at 10:36