JQuery / JS имеет дело с «двойной фокус» с курсором и событием - PullRequest
1 голос
/ 05 февраля 2010

Я включаю навигацию с помощью клавиатуры для меню. Я столкнулся с проблемой в конкретной ситуации:

<ul>
    <li><a href="" class="link1">link</a></li>
    <li><a href="" class="link2">link</a></li>
    <li><a href="" class="link3">link</a></li>
</ul>

JQuery:

$('ul').keypress(function (eh){
    var keyPressed = eh.keyCode;
    if (keyPressed=='37'){
        $currentFocusedLink.closest('li').prev('li:first').find('a:first').focus()

};

Что происходит:

Я фиксирую клавиши со стрелками для перемещения между меню. Это работает ЗА ИСКЛЮЧЕНИЕМ, когда курсор находится перед первым символом одной ссылки, и я нажимаю стрелку назад.

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

Есть ли способ обойти эту проблему?

UPDATE:

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

HTML:

<div class="testNav">
      <a href="">TEST LINK 1</a>
      <a href="">TEST LINK 2</a>
      <a href="">TEST LINK 3</a>
      <a href="">TEST LINK 4</a>
      <a href="">TEST LINK 5</a>
</div>

Jquery:

var $ activeLink;

$('.testNav')
    .find('a')
        .focus(function(){
             $activeLink = $(this);      
        })
        .end()
    .keypress(function (eh){
        var keyPressed = eh.keyCode;
        if (keyPressed=='37'){
            $activeLink.prev('a').focus()
        };
     });

Обратите внимание, что вы можете просто переходить вперед и назад к каждой ссылке.

Теперь перейдите на 5-ю ссылку и нажмите стрелку назад. Он перейдет к ссылке 3. Нажмите еще раз, и она перейдет к ссылке 1.

Я думаю причина как указана выше ... мой скрипт применяет фокус, но так же поступает и перемещение курсора в предыдущий тег привязки. И то и другое происходит, когда вы нажимаете стрелку назад.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2010

РЕШЕНИЕ:

Это должно было произойти со мной раньше, но в конечном итоге нужно было прикрепить функцию «protectDefault ()» к событию нажатия клавиши. Ключ заключается в том, чтобы сначала обнаружить нажатия клавиш, а затем предотвращать дефолт только на тех клавишах, которые вы ищете (или же потерять функциональность клавиатуры на веб-странице).

0 голосов
/ 05 февраля 2010

Вы можете использовать плагин jCaret , чтобы проверить, был ли ваш курсор перед первым символом, и обработать эту ситуацию как регистр.

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