2010-02-07 3 views
15

Я пытаюсь настроить меню, которое можно перемещать с помощью клавиш со стрелками. У меня этот рабочий плагин в Firefox.Обнаружение нажатия клавиши со стрелкой в ​​IE через javascript/jQuery

Попытка заставить его работать в IE8 и после некоторой битвы обнаружила, что это произошло потому, что IE8 не зарегистрировал нажатие клавиш на стрелках. Для теста:

$(document).keypress(function (eh){ 
    alert(eh.keyCode); 
}; 

В Firefox, нажав любую из клавиш со стрелками не будет вызывать тревогу 37, 38, 39 или 40.

В IE8, ничего. Любой другой ключ на стандартной QWERTY-клавиатуре будет зарегистрирован, но не клавиши со стрелками.

Это проблема с моим Javascript? Настройка браузера? Настройка Windows?

+1

Пожалуйста, не забудьте проверить, нажимает ли пользователь клавиши Alt. Это действительно плохое поведение, когда вы используете и для навигации, не допуская поведения по умолчанию для просмотра взад и вперед, используя и . –

+0

@Marcel Что делает альт-стрелка навигация? Я никогда не использовал его и не делал ничего в браузерах, которые я использую. –

+0

По крайней мере, в Firefox, Chrome и IE (просто быстрый тест) - это то же самое, что и нажатие кнопки «Назад», - это как нажатие кнопки «вперед» (я очень часто использую эти горячие клавиши). –

ответ

38

Из jQuery keypress documentation (последний абзац вводного текста):

Обратите внимание, что keydown и keyup обеспечивают код, указывающий, какая клавиша нажата, в то время как keypress указывает, какой символ был введен. Например, нижний регистр «a» будет указываться как 65 на keydown и keyup, но как 97 на keypress. В верхнем регистре «А» сообщается как 97 по всем событиям. Из-за этого различия, при выборе особых нажатий клавиш, таких как клавиши со стрелками, .keydown() или .keyup() - лучший выбор.

Он даже буквально упоминает о клавиш со стрелками;) Таким образом, вы действительно должны зацепить либо в keydown или keyup событий. Вот SSCCE с keydown, просто скопируйте его. Нет, вам не нужно делать проверку совместимости с браузером на event, это работает во всех браузерах от IE6 до Firefox.

<!doctype html> 
<html lang="en"> 
    <head> 
     <title>SO question 2217553</title> 
     <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> 
     <script> 
      $(document).keydown(function(event) { 
       switch (event.keyCode) { 
        case 37: alert('left'); break; 
        case 38: alert('up'); break; 
        case 39: alert('right'); break; 
        case 40: alert('down'); break; 
       } 
      }); 
     </script> 
    </head> 
    <body> 
     <p>Press one of the arrow keys.</p> 
    </body> 
</html> 
+1

+1 за то, что вы даете подробный ответ. -1 для меня не для RTFMing. ; o) –

+0

Добро пожаловать. – BalusC

+0

Для будущих людей, имеющих эту проблему, обратите внимание, что вы должны использовать событие 'keydown' для' $ (document) ', а не' $ (window) '(это была проблема, с которой я столкнулся). –

7

Попробуйте это:

$(document).keydown(function (e) { 
    if(!e) { 
     e = window.event; 
    } 
    switch(e.keyCode) { 
    case 37: 
     goLeft(); 
     break; 
    case 39: 
     goRight(); 
     break; 
    } 
}); 
+0

Является ли проверка для 'window.event' необходимой с помощью jQuery? Я понял, что он устранил необходимость этого. –

1

Потому что я иногда не хотят событий в пузырьке для некоторых ключей, я использую что-то вроде: Настройте коды/ключи, как вы усмотрению.

/* handle special key press */ 
function checkCptKey(e) 
{ 
    var shouldBubble = true; 
    switch (e.keyCode) 
    { 
     // user pressed the Tab                                   
     case 9: 
      { 
       $(".someSelect").toggleClass("classSelectVisible"); 
       shouldBubble = false; 
       break; 
      }; 
      // user pressed the Enter  
     case 13: 
      { 
       $(".someSelect").toggleClass("classSelectVisible"); 
       break; 
      }; 
      // user pressed the ESC 
     case 27: 
      { 
       $(".someSelect").toggleClass("classSelectVisible"); 
       break; 
      }; 
    }; 
    /* this propogates the jQuery event if true */ 
    return shouldBubble; 
}; 

/* user pressed special keys while in Selector */ 
$(".mySelect").keydown(function(e) 
{ 
    return checkCptKey(e); 
}); 
Смежные вопросы