Как перейти к следующему HTML-элементу с помощью Java Script - PullRequest
0 голосов
/ 07 марта 2011

Предположим, у меня есть базовая HTML-страница с 5 текстовыми полями и одной кнопкой в ​​конце.

Теперь я хочу перейти к следующему элементу HTML, скажем, к следующему TextBox (то же, что и Tab ), при нажатии клавиши 412 и при нажатии клавиши 417 , я смогу вернуться к предыдущему элементу (То же, что и Shift + Tab ).

Теперь я не могу использовать Tab или вы можете сказать, что клавиша Tab отсутствует на моей клавиатуре. Любая помощь.

Хорошо. Код для обнаружения нажатия клавиши приведен ниже:

document.onkeyup = KeyCheck;       
function KeyCheck()

{

   var KeyID = event.keyCode;
   document.Form1.KeyName.value = event.keyCode;

  switch(KeyID)

   {

      case 412:

      document.Form1.KeyName.value = "Rewind Prseesd";

      break; 

      case 417:

      document.Form1.KeyName.value = "Forward Pressed";

      break;
      ....................
}

Теперь я хочу сделать Next и Prev по коду ключа 412 и 417

Ответы [ 3 ]

1 голос
/ 07 марта 2011

Во-первых, создайте массив со всеми элементами в нужном порядке:

var _arrElements = [ "myInput1", "myInput2", "myInput3" ];

Во-вторых, измените свой код, чтобы обнаружить текстовое поле, из которого была нажата клавиша, найти его идентификатор в массиве и сфокусировать нужныйтекстовое поле до или после него:

function KeyCheck(evt) {
    if (typeof evt == "undefined" || !evt)
        evt = window.event; //IE...

    var KeyID = evt.which || evt.keyCode;
    var flag = 0;
    switch(KeyID) {
        case 34:
            flag = -1; //Backward
            break; 
         case 33:
             flag = 1; //Forward
             break;
    }
    if (flag == 0)
        return; //key is not relevant

    var sender = evt.target || evt.srcElement;
    if (!sender)
        return; //key up did not come from valid element

    var nIndex = -1;
    for (var i = 0; i < _arrElements.length; i++) {
        if (sender.id == _arrElements[i]) {
            nIndex = i;
            break;
        }
    }
    if (nIndex < 0)
        return; //key up did not come from valid textbox

    var newIndex = nIndex + flag;
    if (newIndex >= _arrElements.length)
        newIndex = 0;
    if (newIndex < 0)
        newIndex = _arrElements.length - 1;
    document.getElementById(_arrElements[newIndex]).focus();
}

Живой тестовый пример с полным кодом доступен здесь: http://jsfiddle.net/yahavbr/vAh8R/

В примере я использую Page Up / Page Down,Понятия не имею, какие ключи генерируют коды, которые вы дали.

Редактировать: вы можете поместить идентификатор каждого фокусируемого элемента, который вы хотите в массиве, это не обязательно должно быть только текстовое поле.

0 голосов
/ 07 марта 2011

Вы можете получить доступ к предыдущему и следующему элементам DOM (если есть) с помощью свойств previousSibling и nextSibling, к элементам предыдущего и следующего элемента (если есть) с помощью свойства previousElementSibling и nextElementSibling. Если элементы, между которыми вы хотите перемещаться, не являются родственными элементами, это становится сложнее. Библиотека JS была бы большой помощью, упрощая обход.

Вы также можете предварительно обрабатывать формы, используя свойство elements, создавая набор входов в порядке tabIndex и отслеживая текущий ввод, обновляя всякий раз, когда пользователь нажимает соответствующую клавишу или когда вход усиливает или теряет фокус.

Подход на основе DOM (непроверенный, возможно , вероятно, глючит):

if (! Array.prototype.append) {
    Array.prototype.append = function(arr) {
        this.push.apply(this, arr);
    }
}
if (! Array.prototype.each) {
    Array.prototype.each = function(f) {
        for (var i=0; i < this.length; ++i) {
            f(this[i], i);
        }
    }
}
if (! Array.prototype.filter) {
    Array.prototype.filter = function(f) {
        var other = [];
        if (!f) {
            f = function (x) {return x;};
        }
        for (var i=0; i < this.length; ++i) {
            if (f(this[i])) {
                other.push(this[i]);
            }
        }
        return other;
    }
}

// call this on the form element
function keyNavigation(form, nextKey, prevKey, modifier) {
    if (nextKey) {
        nextKey = nextKey.toLowerCase();
    } else {
        nextKey = 'n';
    }
    if (prevKey) {
        prevKey = prevKey.toLowerCase();
    } else {
        prevKey = 'p';
    }
    switch (modifier) {
    case 'ctrlKey':
    case 'altKey':
    case 'metaKey':
        break;
    case 'ctrl':
    case 'alt':
    case 'meta':
        modifier += 'Key';
        break;
    default:
        modifier = 'ctrlKey';
        break;
    }
    var inputs=[], assigned = [], unassigned=[], input, j=0;
    for (var i=0; i < form.elements.length; ++i) {
        input = form.elements[i];
        if (input.tabIndex) {
            j = input.tabIndex;
            while(assigned[j]) {++j}
            assigned[j] = input;
        } else if (!input.disabled) {
            unassigned.push(input);
        }
    }
    inputs = assigned.filter();
    inputs.append(unassigned);
    inputs.each(function (input, keyedIdx) {
        input.keyedIdx = keyedIdx;
    });

    var currIdx;

    form.gotoNextInput = function() {
        // if currIdx is undefined, comparison should be false
        if (currIdx+1 < inputs.length) {
            inputs[++currIdx].focus();
        }
    }
    form.gotoPreviousInput = function() {
        // if currIdx is undefined, comparison should be false
        if (currIdx && currIdx > 0) {
            inputs[++currIdx].focus();
        }
    }
    form.addEventListener('keypress', function (evt) {
            if (evt[modifier]) {
                switch (String.fromCharCode(evt.keyCode).toLowerCase()) {
                    case nextKey:
                        evt.stopPropagation();
                        evt.preventDefault();
                        this.gotoNextInput();
                        return false;
                    case prevKey:
                        evt.stopPropagation();
                        evt.preventDefault();
                        this.gotoPreviousInput();
                        return false;
                }
            }
        }, true);
    // programmatic setting of focus above should invoke this
    // handler. Wasteful, but not problematic.
    form.addEventListener('focus', function (evt) {
            if (typeof evt.target.keyedIdx == 'number') {
                currIdx = evt.target.keyedIdx;
            }
        }, true);
    form.addEventListener('blur', function (evt) {
            delete currIdx;
        }, true);
}
0 голосов
/ 07 марта 2011

Оберните элементы в div и добавьте к нему обработчик события keypress.

Эта страница имеет пример внизу: http://www.quirksmode.org/js/keys.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...