我有一个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时,搜索框不会出现)。 / p>
调用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,这是否成立?
答案 0 :(得分:2)
<强>已更新强>
我现在整理了这个。很抱歉删除了以下评论的上下文,但是嘿,之前的版本仍然存在。
事实证明,在IE中有两个问题需要解决:首先是与我之前所说的相反,在onkeydown
中放置<body>
属性不起作用。您需要将其附加到文档中。第二个问题是IE不会让你压制魔术行为,例如由F3键触发的搜索对话框,除非你做了一个涉及更改keydown
事件的keyCode
属性的邪恶黑客,这显然是事实上非常错误。尽管如此,删除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;
}
};
答案 1 :(得分:0)
即使您通过修改事件阻止了默认操作,也应始终从事件处理程序返回false,有关详细信息,请参阅Quirks mode。