Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Ввод номера сотового телефона (https://javascript.ru/forum/dom-window/13569-vvod-nomera-sotovogo-telefona.html)

DmitryOpalev 04.12.2010 13:45

Ввод номера сотового телефона
 
Здравствуйте!
У меня есть поля типа
8-<input size='3'>-<input size='3'>-<input size='2'>-<input size='2'>

Как сделать, что при заполнении одного поля, фокус автоматически переходил на следующее?

Gvozd 04.12.2010 14:18

Вы просите готовый скрипт с нуля.

Это работа, и за нее обычно платят деньги.
Для таких сообщений предназначен раздел форума "Работа".

Если вы все же хотите, чтобы вам помогли - приложите какие-то усилия сами и задавайте вопросы по ходу дела.

DmitryOpalev 04.12.2010 14:51

Цитата:

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

Gvozd 04.12.2010 14:57

используйте события onchange для первого элемента, и когда его свойство value(являющееся его содержимым) достигнет нужной вам длины, вызовите метод focus() у соответсвующегго элемента

Vulkan 04.12.2010 15:08

Вот вам решение, подстраивайте под свою страничку:
<script>
window.onload=function(){
var inputs=document.getElementsByTagName('input');
for(i=0; i<inputs.length; i++) inputs[i].onkeydown='verifyLength(this, '+i+')';
}

function verifyLength(input, order){
var inputs=document.getElementsByTagName('input');
if(input.size==input.value.length) inputs[order+1].focus();
}
</script>

8 -<input size="3"> -<input size="3"> -<input size="2"> -<input size="2">

monolithed 04.12.2010 15:28

Как-то так:
<script type="text/javascript">
window.onload = function(){
    var input = document.getElementsByName('input'), i = input.length;
    while(i--){
        input[i].onkeyup = (function(i){
            return function(){
                if (this.size == this.value.length && input[i + 1]) {
                    input[i+1].focus();
                }
            };
        })(i);
    }
};
</script>
8
-<input type="text" size="3" maxlength="3" name="input" />
-<input type="text" size="3" maxlength="3" name="input" />
-<input type="text" size="4" maxlength="4" name="input" />


PS: на самом деле еще нужно делать несколько проверок:
- только цифры
- очищать постидущие поля

Vulkan 04.12.2010 18:52

monolithed, в моём и твоём примере есть ещё один недостаток - если нажать клавишу любую и не отпускать, текст будет печататься но не перескакивать, понятно что происходит это всё из-за того что событие одно и проверяется только один раз при зажатии клавиши. А в моём примере также недостаток ещё это то что при полном поле инпута клавиша бекспейс не отработает, но это можно решить проверкой кейкода (код бекспейса 8).

monolithed 04.12.2010 19:41

Цитата:

Сообщение от Vulkan
monolithed, в моём и твоём примере есть ещё один недостаток - если нажать клавишу любую и не отпускать

Не вопрос подправить, я эту проблему сразу предусмотрел, но забыл о первых двух элементах (в последнем было):)

Цитата:

Сообщение от Vulkan
текст будет печататься но не перескакивать, понятно что происходит это всё из-за того что событие одно и проверяется только один раз при зажатии клавиши.

для этого достаточно ограничить вводимое количество символов использую maxlength.

Цитата:

Сообщение от Vulkan
А в моём примере также недостаток ещё это то что при полном поле инпута клавиша бекспейс не отработает, но это можно решить проверкой кейкода (код бекспейса 8).

Я вообще не смог его запустить (в fierefox точно не работает).

Vulkan 04.12.2010 20:39

Цитата:

Сообщение от monolithed (Сообщение 82269)
Я вообще не смог его запустить (в fierefox точно не работает).

Точно, в опере работает, в файрфоксе нет. Вот исправленный вариант:
<script>
window.onload = function () {
    var inputs = document.getElementsByTagName('input');
    for (i = 0; i < inputs.length; i++) {
        inputs[i].onkeyup = (function (x) {
            return function () {
                if (inputs[x].size == inputs[x].value.length && inputs[x + 1]) {
                    inputs[x + 1].focus();
                }
            }
        })(i)
    }
}
</script>

8 -<input size="3" maxlength="3"> -<input size="3" maxlength="3"> -<input size="2" maxlength="2"> -<input size="2" maxlength="2">

С onkeyup backspace работает, ну понятно почему, событие проверяется когда клавиша отжимается, а когда backspace отожмётся уже условие для смены фокуса выполняться не будет.

рони 04.12.2010 20:59

monolithed, Vulkan на всякий случай сделайте проверку на наличие input[i+1] прежде чем передать ему фокус )))

Gozar 04.12.2010 22:52

удалено.

Vulkan 05.12.2010 08:00

рони, точно, я про это думал, но забыл, сейчас исправил

рони 05.12.2010 19:21

Вариант готового решения не нашёл, буду признателен если кто подскажет ссылку, пока собрал трёхколёсный велосипед без maxlength и рабочим backspace )))
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title></title>
<script type="text/javascript">
window.onload = function () {
    for (var b = document.getElementsByName("input"), e = b.length; e--;) {
        b[e].onkeypress = function (d) {
            return function (c) {
                c = c || window.event;
                a = c.which || c.keyCode;
                if (this.size == this.value.length && a != 8) if (b[d + 1]) b[d + 1].focus();
                else return false
            }
        }(e);
        b[e].onkeydown = function (d) {
               return function (c) {
                c = c || window.event;
                a = c.which || c.keyCode;
                if (this.size == this.value.length && a != 8) if (b[d + 1]) b[d + 1].focus();
                else return false;
                if (this.value.length == 0 && b[d - 1] && a == 8) {
                    if (b[d - 1].createTextRange) {
                        a = b[d - 1].createTextRange();
                        a.collapse(false);
                        a.select()
                    } else if (b[d - 1].selectionStart) {
                        a = b[d - 1].value.length;
                        b[d - 1].setSelectionRange(a, a);
                        b[d - 1].focus()
                    }
                    return false
                }
            }
        }(e)
    }
};
</script>
</head>
<body>
8-
<input type="text" size="3"  name="input" />
<input type="text" size="3"  name="input" />
<input type="text" size="2"  name="input" />
<input type="text" size="2"  name="input" />
</body>
</html>

Kolyaj 05.12.2010 19:25

В чём проблема вводить все цифры в одно поле?

x-yuri 06.12.2010 06:58

странно, что ты тот доклад не упомянул. Хотя в общем-то вряд ли ТС (и не только) его посмотрит, несмотря на то, что как раз тот случай (где-то с 18:45 :))

p.s. тема для оффтопа: "Что значит 'от добра добра не ищут'?"

monolithed 06.12.2010 10:23

Цитата:

Сообщение от рони
трёхколёсный велосипед без maxlength

а почему бы не установить его в самом элементе, а то при удержании клавиши 3-е поле может принимать больше 2-х символов

ksa 06.12.2010 10:26

Цитата:

Сообщение от Kolyaj
В чём проблема вводить все цифры в одно поле?

А это для того, чтобы потом преодалевать трудности при записи в БД... :D

рони 06.12.2010 10:34

Цитата:

Сообщение от monolithed
а то при удержании клавиши 3-е поле может принимать больше 2-х символов

Можно узнать в каком это браузере? или это не про мой вариант?

monolithed 06.12.2010 11:12

Цитата:

Сообщение от рони
Можно узнать в каком это браузере? или это не про мой вариант?

Про ваш
Когда удерживаешь клавишу до полного заполнения всех полей, потом если вернуться ко второму полю и ввести в него сиволы то он перебросит на третье и начнет добавлять в него символы в Firefox 3.6, в Opera 10.5 еще и последнее поле начинает принимать символы.


Часовой пояс GMT +3, время: 07:35.