Захватывать время в Javascript

У меня есть веб-интерфейс для приложения AS/400 CGI, который позволяет использовать некоторые клавиши F1-F24 (в зависимости от страницы), а также переход на страницу вверх, вниз страницы и т. Д. - они передаются в базовый приложение, которое обрабатывает их соответствующим образом. Например, на данной странице пользователь может либо нажать кнопку F3, либо нажать клавишу F3 - обе они установят (скрытую) переменную CmdKey, чтобы иметь имя _K03 и значение F03. Работа с кнопками проста и не имеет проблем. Для работы с пользователями, нажимающими настоящую F-клавишу на клавиатуре, у меня уже давно есть IE-совместимый скрипт, который отлично работает:

function setCmdKeyIE() {                                                        
  var cmdkeycode = "";                                                          
  if (window.event.keyCode != 13 &
    window.event.keyCode != 33 &                 
    window.event.keyCode != 34 &
    window.event.keyCode < 112 ) return;         
  window.event.keyCode = window.event.keyCode + 1000;                           
  if (window.event.shiftKey) window.event.keyCode = window.event.keyCode + 1000;
  switch(window.event.keyCode) {                                                
    case 1013: cmdkeycode = "EN"; break; /* Enter */                            
    case 1033: cmdkeycode = "UP"; break; /* Page Up */                          
    case 1034: cmdkeycode = "DN"; break; /* Page Down  */                       
    case 1112: cmdkeycode = "01"; break; /* F1 */                               
    case 1113: cmdkeycode = "02"; break; /* F2 */                               
    ...(F3 thru F24 here)...
    default:   return;                   /* Anything else should be ignored */
  }                                                         
  window.event.cancelBubble = true;                         
  window.event.returnValue = false;                         
  document.forms[0].CmdKey.value = "F" + cmdkeycode;        
  document.forms[0].CmdKey.name = "_K" + cmdkeycode;        
  if (ONSUBMITFUN() == true) document.forms[0].submit();    
}                                                           

Это не только правильно устанавливает элемент CmdKey, но и переопределяет (останавливает) поведение браузера по умолчанию (если оно есть) от выполнения (например, когда пользователь нажимает клавишу F3, поле поиска не отображается).

Функция setCmdKeyIE() вызывается следующим образом:

<body onKeyDown="setCmdKeyIE();" onHelp="return false;">

Теперь мне нужно, чтобы это работало для Firefox (и, возможно, других браузеров), и у меня возникли всевозможные проблемы. Первоначально я изменил функцию setCmdKeyIE (да, я знаю, что имя следует изменить, как только оно больше не зависит от IE, но это меньше всего меня беспокоит!), Чтобы получить событие в качестве параметра (что было бы только в случае с FF, Я думал) или использовать текущее поведение, если оно не прошло (с IE). Я также добавил некоторую другую обработку, чтобы остановить распространение событий FF, но она не работает...

Вот новый нерабочий код - может ли какая-то добрая душа указать на ошибку моих путей?

function setCmdKey(e) {
  if (!e) {
    var e = window.event; /* IE event-handling */
  }
  var wrkkeyCode = e.keyCode;
  if (wrkkeyCode != 13 &
      wrkkeyCode != 33 &
      wrkkeyCode != 34 &
      wrkkeyCode != 27 &
      wrkkeyCode < 112 ) return;
  wrkkeyCode = wrkkeyCode + 1000;
  if (e.shiftKey) wrkkeyCode = wrkkeyCode + 1000;
  var cmdkeycode = "";
  switch(wrkkeyCode) {
    case 1013: cmdkeycode = "EN"; break; /* Enter */
    case 1033: cmdkeycode = "UP"; break; /* Page Up */
    case 1034: cmdkeycode = "DN"; break; /* Page Down  */
    case 1112: cmdkeycode = "01"; break; /* F1 */
    case 1113: cmdkeycode = "02"; break; /* F2 */
    ...(F3 thru F24 here)...
    default:   return;               /* Anything else should be ignored */
  }
  if (e.stopPropagation) {           /* FF */
    e.stopPropagation();
    e.preventDefault();
  }
  else {                             /* IE */
    e.cancelBubble = true;
    e.returnValue = false;
  }
  document.forms[0].CmdKey.value = "F" + cmdkeycode;
  document.forms[0].CmdKey.name = "_K" + cmdkeycode;
  if (ONSUBMITFUN() == true) document.forms[0].submit();
}

Нужно ли возвращать false из setCmdKeyIE с FF? Верно ли это, даже если эта процедура возвращает false?

2 ответа

Решение

ОБНОВЛЕНО

Я разобрался с этим сейчас. Извините за удаление контекста для комментариев ниже, но эй, предыдущие версии все еще там.

Оказывается, в IE нужно решить две проблемы: во-первых, это противоречит тому, что я сказал ранее, onkeydown атрибут в <body> не работает Вам нужно прикрепить его к документу. Вторая проблема заключается в том, что IE не позволит вам подавить магическое поведение, такое как диалоговое окно поиска, запускаемое клавишей F3, если вы не совершите злой хак, включающий изменение keydown События keyCode собственность, которая явно является очень неправильным. Как бы то ни было, удалите onkeydown атрибут в <body> и следующее должно сделать эту работу (теперь исправлено, чтобы работать в Опере также):

var keyCodeMap = {
    "1013": "EN",
    "1033": "UP",
    "1034": "DN",
    "1112": "01",
    "1113": "02",
    "1114": "03"
    // ...(F4 thru F24 here)...
};

var suppressKeypress = false;

function setCmdKey(e) {
    e = e || window.event;
    var wrkkeyCode = e.keyCode;
    if (wrkkeyCode != 13 &&
        wrkkeyCode != 33 &&
        wrkkeyCode != 34 &&
        wrkkeyCode != 27 &&
        wrkkeyCode < 112) return;

    wrkkeyCode += 1000;

    if (e.shiftKey) wrkkeyCode += 1000;
    var cmdkeycode = keyCodeMap[wrkkeyCode];
    if (!cmdkeycode) return; /* Anything else should be ignored */

    var input = document.forms[0].elements["CmdKey"];
    input.value = "F" + cmdkeycode;
    input.name = "_K" + cmdkeycode;

    try {
        // Prevent default action in IE by bad hacky means
        e.keyCode = 0;
    } catch (ex) {
        // Other browsers do not allow setting the keyCode
    }
    suppressKeypress = true;

    if (ONSUBMITFUN()) document.forms[0].submit();
    return false;
}

document.onkeydown = setCmdKey;
document.onkeypress = function() {
    if (suppressKeypress) {
        return false;
    }
};

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

Другие вопросы по тегам