Как я могу отслеживать клавиши со стрелками в Chrome и IE?

Im, использующий следующий код для отслеживания ключевых событий

oEvent=window.event || oEvent;
    iKeyCode=oEvent.keyCode || oEvent.which;alert(iKeyCode);

он дает мне оповещения в firefox, но не в IE и хром. Это дает мне все другие символы keyborad, но не клавиши esc и клавиши со стрелками.

Как я могу обнаружить ключ esc и клавиши со стрелками в chrome и IE с помощью javascript?

Ответ 1

Вам не нужен JQuery, хотя он делает ваш код короче.

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

Здесь есть полный учебник, который вы можете использовать, см. пример со стрелочными клавишами в нижней части страницы: http://www.cryer.co.uk/resources/javascript/script20_respond_to_keypress.htm

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

document.onkeydown = function(event) {
     if (!event)
          event = window.event;
     var code = event.keyCode;
     if (event.charCode && code == 0)
          code = event.charCode;
     switch(code) {
          case 37:
              // Key left.
              break;
          case 38:
              // Key up.
              break;
          case 39:
              // Key right.
              break;
          case 40:
              // Key down.
              break;
     }
     event.preventDefault();
};

Ответ 2

Я столкнулся с такой же проблемой. Существует по крайней мере одно отличие Chrome обрабатывает события keypress и keydown/keyup. Событие keypress в Chrome не запускается для клавиш со стрелками, тогда как для keydown и keyup оно есть.

Ответ 3

проблема: webkit отправляет код ключа 38 (стрелка вверх) для нажатия клавиши shift-7 (амперсанд).

сводка: и и оба равны 38.%, а оба равны 37. 'и правые оба равны 39. (и вниз оба равны 40. для firefox и opera, 37/38/39/40 не отправляются за &,%, ', (они отправляют только те, что указаны вверх, вниз, влево, вправо, но webkit и т.д. Отправляют 37/38/39/40 для обеих клавиш со стрелками и & %, ', (обратите внимание, что для up/down/left/right webkit устанавливает charCode в 0, но не для &,%,', (.

:, поэтому, если вы обрабатываете эти события по коду ключа, вам нужно либо игнорировать, когда клавиша shift выключена, либо проверить, является ли charCode 0

  • Лучший ресурс: http://unixpapa.com/js/key.html
  • Протестируйте браузер: http://asquare.net/javascript/tests/KeyCode.html
  • bugs.jquery.com/ticket/7300. "Это делается для того, чтобы соответствовать IE. События keypress должны запускаться только для ключей, которые вставляют символы. Обратите внимание, что keydown/keyup срабатывают для клавиш со стрелками".
  • Интересный проект: github.com/OscarGodson/jKey

Ответ 4

Используйте jQuery и используйте что-то вроде этого:

$(document).keydown(function(e){
    if (e.keyCode == 37) { 
        alert( "left pressed" );
        return false;
    }
});

Коды символов:

37: left

38: вверх

39: right

40: вниз

Ответ 5

Демо

Попробуйте использовать библиотеку jquery, чтобы сделать то, что вам нужно, а затем позвоните ниже. В демо вы можете щелкнуть в поле ввода, а затем начать вводить текст. Он предупредит вас о key code. Вы можете связать этот прослушиватель событий с любым элементом вашей страницы. Это не просто вход.

$(document).ready(function() { 
    KEY_CODES = {
      37: 'left',
      38: 'up',
      39: 'right',
      40: 'down'
    }

    KEY_STATUS = { keyDown:false };
    for (code in KEY_CODES) {
      KEY_STATUS[KEY_CODES[code]] = false;
    }

    $(window).keydown(function (e) {

      KEY_STATUS.keyDown = true;

      // perform functionality for keydown
      if (KEY_CODES[e.keyCode]) {
          e.preventDefault();
          alert('arrow');
          if(e.keyCode == 40)
          {
              // Arrow Down 
          }

          else if(e.keyCode == 39)
          {
              // Arrow Right    
          }

          else if(e.keyCode == 38)
          {
              // Arrow Up    
          }

          else if(e.keyCode == 37)
          {
              // Arrow Left    
          }

      }

    }).keyup(function (e) {
      KEY_STATUS.keyDown = false;
      if (KEY_CODES[e.keyCode]) {          
        e.preventDefault();
        KEY_STATUS[KEY_CODES[e.keyCode]] = false;
      }
    });

});

Ответ 6

Вот краткая формулировка:

document.onkeydown = function(e) {
    switch (e.keyCode) {
        case 37:
            alert('left');
            break;
        case 38:
            alert('up');
            break;
        case 39:
            alert('right');
            break;
        case 40:
            alert('down');
            break;
    }
};

Однако, если вы используете JQuery, вам лучше использовать e.which, который JQuery "нормализует" для учета различий между браузерами:

$(document).keydown(function(e) {
    switch(e.which) {
        // the rest is the same

Ответ 7

Это работало для меня в Opera20 и IE8. (У меня нет Chrome для тестирования.)

var keyPressListenerFn = function(event) {
    if (!event){ event = window.event }
    var code = event.charCode && event.keyCode == 0 ? event.charCode : event.keyCode
    switch(code) {
        case 37: prev(); break // left
        case 39: next(); break // right
    }
    if (event.preventDefault){ event.preventDefault() } // opera20
    if (event.returnValue){ event.returnValue = false } // ie8
}
var addEvent = document.attachEvent ? document.attachEvent : document.addEventListener
addEvent('keydown', keyPressListenerFn)   // opera20
addEvent('onkeydown', keyPressListenerFn) // ie8