Захватывать время в Javascript - PullRequest
2 голосов
/ 20 июля 2010

У меня есть веб-интерфейс для приложения 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 ]

2 голосов
/ 20 июля 2010

ОБНОВЛЕНО

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

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

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;
    }
};
0 голосов
/ 03 августа 2010

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

...