Использование стрелок-клавиш для навигации - PullRequest
16 голосов
/ 14 июля 2010

Мне интересно, была ли возможность с помощью клавиш со стрелками перемещаться по таблице, которую я создал с помощью JS (используя jQuery)?Я имею в виду прыжок из клетки в клетку ... Сценарий для Greasemonkey.

Предупреждение, однако, работает.Я просто понятия не имел, как сделать это хорошо функционирующим.

<code>$(document).keydown(function(e){
    if (e.keyCode == 37) { 
       alert( "left pressed " );
       return false;
    }
    if (e.keyCode == 38) { 
       alert( "up pressed " );
       return false;
    }
    if (e.keyCode == 39) { 
       alert( "right pressed " );
       return false;
    }
    if (e.keyCode == 40) { 
       alert( "down pressed " );
       return false;
    }
});
;

Любой намек или что-либо очень ценится.Заранее спасибо, Файли

Обновление

Кажется, я объяснил себя неправильно.Дайте мне еще одну попытку: Демо

Это может дать вам представление о том, что я хотел.После выбора одного поля ввода возможна навигация с помощью клавиш со стрелками.Моя проблема в том, что я просто не могу понять это с помощью GM и JQuery.Любая идея?

Еще раз спасибо за ваше время и усилия.

Наконец это было похоже:

<code>
function myTest_analysis1(e,leftkey,up,right,down){
    myTest(e,'','','field_analysis2','field_communication1')</p>

<p>function myTest(e,leftkey,up,right,down)
{
  if (!e) e=window.event;
  var selectArrowKey;
  switch(e.keyCode)
  {
  case 37:
    // Key left.
    selectArrowKey = leftkey;
    break;
  case 38:
    // Key up.
    selectArrowKey = up;
    break;
  case 39:
    // Key right.
    selectArrowKey = right;
    break;
  case 40:
    // Key down.
    selectArrowKey = down;
    break;
  }
  if (!selectArrowKey) return;<br>
  var controls = window.document.getElementById(selectArrowKey);
  if (!controls) return;
  controls.focus();
}
}
 $('#field_analysis1').keydown (myTest_analysis1);
Вот как это сработало для меня.Могу поспорить, что есть более разумное решение, но я не могу понять это прямо сейчас.

Спасибо, ооочень большое за ваше время и усилия.

Ответы [ 3 ]

21 голосов
/ 14 июля 2010

Вот версия, которая допускает следующее

  1. ограничения в начале и конце таблицы (первая и последняя ячейка таблицы)
  2. переносится в конец каждого ряда и переходит к следующему
  3. прокручивает текущую ячейку, если для ее просмотра требуется прокрутка
  4. поддерживает щелчок мышью для выбора ячейки

Демонстрация на : http://jsfiddle.net/BdVB9/


со структурой html, такой как

<table id="navigate">
    <tbody>
        <tr>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
        </tr>
    </tbody>
</table>

и JavaScript

var active = 0;

$(document).keydown(function(e){
    reCalculate(e);
    rePosition();
    return false;
});

$('td').click(function(){
   active = $(this).closest('table').find('td').index(this);
   rePosition();
});


function reCalculate(e){
    var rows = $('#navigate tr').length;
    var columns = $('#navigate tr:eq(0) td').length;
    //alert(columns + 'x' + rows);

    if (e.keyCode == 37) { //move left or wrap
        active = (active>0)?active-1:active;
    }
    if (e.keyCode == 38) { // move up
        active = (active-columns>=0)?active-columns:active;
    }
    if (e.keyCode == 39) { // move right or wrap
       active = (active<(columns*rows)-1)?active+1:active;
    }
    if (e.keyCode == 40) { // move down
        active = (active+columns<=(rows*columns)-1)?active+columns:active;
    }
}

function rePosition(){
    $('.active').removeClass('active');
    $('#navigate tr td').eq(active).addClass('active');
    scrollInView();
}

function scrollInView(){
    var target = $('#navigate tr td:eq('+active+')');
    if (target.length)
    {
        var top = target.offset().top;

        $('html,body').stop().animate({scrollTop: top-100}, 400);
        return false;
    }
}
11 голосов
/ 14 июля 2010

Вы должны быть в состоянии сфокусировать различные ячейки, я приведу пример, используя .focus ()

Вот пример.

Пожалуйста, имейте в виду, что ...

a) В этом примере нет ничего, что могло бы помешать вам выйти за пределы, вам нужно ограничить значения currentRow и currentCell количеством ячеек и не дать им опуститься ниже 0.

б) На данный момент нет кода для удаления зеленого текста, который я использовал для отображения текущего фокуса. Это означает, что зеленый след остался позади.

Вы можете довольно легко решить оба вышеперечисленных вопроса, но они усложнят пример ...

    var currentRow = 0;
    var currentCell = 0;

    function ChangeCurrentCell() {
        var tableRow = document.getElementsByTagName("tr")[currentRow];
        var tableCell = tableRow.childNodes[currentCell];
        tableCell.focus();
        tableCell.style.color = "Green";
    }
    ChangeCurrentCell();

    $(document).keydown(function(e){
        if (e.keyCode == 37) { 
           currentCell--;
           ChangeCurrentCell();
           return false;
        }
        if (e.keyCode == 38) { 
           currentRow--;
           ChangeCurrentCell();
           return false;
        }
        if (e.keyCode == 39) { 
           currentCell++;
           ChangeCurrentCell();
           return false;
        }
        if (e.keyCode == 40) { 
           currentRow++;
           ChangeCurrentCell();
           return false;
        }
    });
10 голосов
/ 14 июля 2010

вот моя версия ...

демо

var active;
$(document).keydown(function(e){
    active = $('td.active').removeClass('active');
    var x = active.index();
    var y = active.closest('tr').index();
    if (e.keyCode == 37) { 
       x--;
    }
    if (e.keyCode == 38) {
        y--;
    }
    if (e.keyCode == 39) { 
        x++
    }
    if (e.keyCode == 40) {
        y++
    }
    active = $('tr').eq(y).find('td').eq(x).addClass('active');
});​
...