编程语言
首页 > 编程语言> > 在Javascript中捕获onkeydown

在Javascript中捕获onkeydown

作者:互联网

我有一个AS / 400 CGI应用程序的Web前端,允许使用一些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();
}

我是否需要使用FF从setCmdKeyIE返回false?即使此过程返回false,这是否成立?

解决方法:

更新

我现在整理了这个.很抱歉删除下面评论的上下文,但是,嘿,以前的版本仍然存在.

事实证明,在IE中有两个问题需要解决:首先是与我之前所说的相反,在< body>中放入一个onkeydown属性.不起作用.您需要将其附加到文档中.第二个问题是IE不会让你压制魔术行为,例如由F3键触发的搜索对话框,除非你做了一个涉及改变keydown事件的keyCode属性的邪恶黑客,这显然是一个非常错误的事情.尽管如此,删除< body>中的onkeydown属性.并且以下应该完成这项工作(现在修改为也在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;
    }
};

标签:ibm-midrange,onkeydown,javascript,javascript-events,cross-browser
来源: https://codeday.me/bug/20191007/1866173.html