Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Перемещение между строками ввода стрелками

Сообщения:  [1-4] 

 
 автор: АЯ   (03.10.2009 в 16:53)   письмо автору
 
   для: Воитель   (03.10.2009 в 11:15)
 

<html>
<head>
<script>
onload = function ()
{ // назначаем инпутам "номерные" идентификаторы и "навешиваем" на них функцию funcCF
for (var ob = document.getElementById ('abc').getElementsByTagName ('input'), k = 0,
r = 1; r < 6; r++) for (var c = 1; c < 5; c++) {ob [k].id = 'r' + r + 'c' + c;
ob [k++].onkeyup = funcCF} // но надо, как выясняется, всё же onkeydown
}

function funcCF (evt)
{ // определяем код нажатой клавиши ko и номера строки ro и столбца ce
var ev = evt || window.event, ko = ev.keyCode, ob = ev.target || ev.srcElement,
x = ob.id.substr (1).split ('c'), ro = x [0] * 1, ce = x [1] * 1;
 // реализуем перемещение фокуса
if (ko == 37 && ce != 1) document.getElementById ('r' + ro + 'c' + (ce - 1)).focus (); // влево
if (ko == 38 && ro != 1) document.getElementById ('r' + (ro - 1) + 'c' + ce).focus (); // вверх
if (ko == 39 && ce != 4) document.getElementById ('r' + ro + 'c' + (ce + 1)).focus (); // вправо
if (ko == 40 && ro != 5) document.getElementById ('r' + (ro + 1) + 'c' + ce).focus (); // вниз

</script>
</head>
<body>
<div id="abc">
<!--    c1         c2         c3         c4           -->
     <input>    <input>    <input>    <input> <!-- r1 -->
<br> <input>    <input>    <input>    <input> <!-- r2 -->
<br> <input>    <input>    <input>    <input> <!-- r3 -->
<br> <input>    <input>    <input>    <input> <!-- r4 -->
<br> <input>    <input>    <input>    <input> <!-- r5 -->
</div>
</body>
</html>

PS. Обнаружил, что в OPERA v.10 почему-то в инпуте не отслеживается onkeyup для клавиши "стрелка вниз", а onkeydown прекрасно работает.

PS2. Использовать name (а не id) тоже можно, однако в этом случае необходимо прописывать его значение непосредственно в теге (в MSIE атрибут name для инпутов является read only) и, соответственно, при использовании метода focus () надо к инпутам обращаться через коллекцию getElementsByName или через форму.

  Ответить  
 
 автор: Воитель   (03.10.2009 в 11:15)   письмо автору
 
   для: АЯ   (03.10.2009 в 04:49)
 

Спасибо.
Отдельное спасибо за примечание.
Передвижение я реализую через name а не id, но как я уже попробовал имя можно тоже легко запросить.
Немного не понятно как изменять кодом имя объекта которому я передам фокус.
С этим вопросом я ещё не рылся в инете, думаю найду ;-)
Знаю что в AS это делается через применение ["r" + var1 + "c" + var2]

  Ответить  
 
 автор: АЯ   (03.10.2009 в 04:49)   письмо автору
 
   для: Воитель   (03.10.2009 в 00:18)
 

В этой задаче вовсе нет необходимости использовать onfocus.

Когда вы будете "ловить" нажатие стрелок (для этого лучше используйте onkeyup, с onkeydown может возникнуть проблема "юзабилити"- см. примечание), то через объект event вы легко сможете узнать не только keyCode нажатой клавиши, но и ВСЁ об объекте, в котором это событие (отпускание клавиши) произошло.
<script>
function funcCF (evt)
{
var ev = evt || window.event, ko = ev.keyCode, ob = ev.target || ev.srcElement;
if (ko < 41 && ko > 36) alert ('id: ' + ob.id + '\narrow: ' + ko);
}
</script>
<input id="r2c3" onkeyup="funcCF (event)">

А если вы в идентификаторе инпутов заложите информацию о номерах строки и столбца (в примере это 2-я строка и 3-й столбец - id="r2c3"), то тогда, определив направление (по коду нажатой стрелки), вам легко будет прибавить/отнять единицу от номера строки (или столбца) текущего инпута, чтобы получить id инпута, куда следует переместить фокус методом focus ().

* Обычный юзер смотрит на клавиатуру, а не на экран, нажимая клавиши. Нажмёт юзер стрелку и программа ТУТ ЖЕ переместит фокус в другое поле. А юзер (ещё не отпуская клавиши) поднимет глаза на экран: фокус моргает - но в том поле, или уже в новом? - юзер уже и не помнит. Отпустил клавишу, а фокус так и "остался" мигать в "том же" поле. Подумает юзер, что ваша "фича" со стрелками не работает. Понятно?
При ловле "отпускания" клавиши таких проблем не будет.

  Ответить  
 
 автор: Воитель   (03.10.2009 в 00:18)   письмо автору
 
 

Здравствуйте.
Думаю все из читающих это сообщение хотябы раз заполняли какую-нибудь анкету, например на регистрирование в этом форуме. И многие при заполнении пользуются клавишей <Tab>
для перехода с одной строки ввода на другую.

У меня на сайте располагается таблица текстовых полей 4 на 5.
И чтобы переместиться на строку ниже надо нажать пользователю <Tab> 5 раз.
Можно ли как-то осуществить переход с помощью стрелок.
Я уже что-то нашёл например:

<body onkeydown="alert(event.keyCode);"> //Нажатие на кпоку
Для управления фокусом у объекта класса окно существуют два метода focus() и blur(). //Думаю для текстовых полей тоже самое.

Но у меня вопрос как узнать у кого сейчас фокус?
Лично у меня только через событие "Появление фокуса" вроде onFocus()
Есть ли какие другие варианты?

Если что из выше написанного не правильно поправьте.

  Ответить  

Сообщения:  [1-4] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования