在Internet Explorer 8中,JavaScript KeyCode值为“未定义”

12

我遇到了一些问题,是关于我所编写的 JavaScript,在 Internet Explorer 8 上无法正常运行。但在 Internet Explorer 7 或更早版本以及 Mozilla Firefox 3.5 或更早版本中执行时,没有任何问题。当我在 Internet Explorer 8 中使用兼容性模式时,它也可以正常执行。

我的操作是在用户在文本框中输入值时,覆盖回车击键。因此,在我的元素上,我有以下代码:

<asp:TextBox ID="ddPassword" runat="server" TextMode="Password" onkeypress="doSubmit(event)" Width="325"></asp:TextBox>

然后我有以下 JavaScript 方法:

function doSubmit(e)
{
    var keyCode = (window.Event) ? e.which : e.keyCode;
    if (keyCode == 13)
        document.getElementById("ctl00_ContentPlaceHolder1_Login").click();  
}

几乎所有的浏览器都可以正常工作,只有IE8会出问题。

非常感谢任何帮助您能够提供的支持。

更新:感谢大家的快速反馈。Chris Pebble和Bryan Kyle都为这个解决方案提供了帮助。我授予Bryan“答案”以帮助他的声誉。谢谢大家!

8个回答

26

看起来在IE8浏览器下,window.EventkeyCode属性值为undefined,但是window.event(注意小写的e)的同名属性具有值。你可以尝试使用window.event

function doSubmit(e)
{
   var keyCode = (window.event) ? e.which : e.keyCode;
   if (keyCode == 13)
      document.getElementById("ctl00_ContentPlaceHolder1_Login").click();  
}

8

有一种可能,可以尝试一下:

var keyCode = e.keyCode ? e.keyCode : e.which;

这在Internet Explorer 8上运行正常,但在其他此代码曾经可以运行的浏览器上却无法运行。 - Matt McCormick
Chris,请看下面我的评论。你和Bryan的帮助解决了这个问题!再次感谢! - Matt McCormick

3
我的代码是这样实现的:
var kcode = (window.event) ? event.keyCode : event.which;

2

尝试这个:

function checkKeyCode(e){  
    if (!e) e = window.event;   var kCd =  e.which ||  e.keyCode;
    return kCd;
}

1

我个人更喜欢多键方法。这样可以检测到多个按键,但也同样适用于单个按键,并且在我测试过的每个浏览器中都可以正常工作。

map={}//declare object to hold data
onkeydown=onkeyup=function(e){
    e=e||event//if e doesn't exist (like in IE), replace it with window.event
    map[e.keyCode]=e.type=='keydown'?true:false
    //Check for keycodes
}

一个替代方法是分离 onkeydown 和 onkeyup 事件,并在每个事件中显式定义 map 子项:
map={}
onkeydown=function(e){
    e=e||event
    map[e.keyCode]=true
}
onkeyup=function(e){
    e=e||event
    map[e.keyCode]=false
}

两种方式都可以。现在,要实际检测按键,方法(包括错误修复)如下:

//[in onkeydown or onkeyup function, after map[e.keyCode] has been decided...]
if(map[keycode]){
    //do something
    map={}
    return false
}

map[keycode] 包含一个特定的键码,例如 13 表示 Enter,或者 17 表示 CTRL

map={} 这一行清除了 map 对象,以防止在失去焦点的情况下“保留”键,而 return false 则可以防止例如检查 CTRL+D 时弹出书签对话框。在某些情况下,您可能需要将其替换为 e.preventDefault(),但我发现在大多数情况下,return false 更有效率。只需尝试使用 CTRL+D 来获得清晰的视角。 Ctrl17,而 D68。请注意,如果没有 return false 行,书签对话框将弹出。

以下是一些示例:

if(map[17]&&map[13]){//CTRL+ENTER
    alert('CTRL+ENTER was pressed')
    map={}
    return false
}else if(map[13]){//ENTER
    alert('Enter was pressed')
    map={}
    return false
}

需要记住的一件事是,较小的组合应该放在最后。在 if..else 链中始终先放置较大的组合,这样您就不会同时收到 EnterCTRL+ENTER 的警报。

现在,一个完整的示例来“将所有内容放在一起”。假设您想要在用户按下 SHIFT+? 时弹出包含登录说明的消息,并在用户按下 ENTER 时登录。此示例还跨浏览器兼容,这意味着它也适用于 IE:

map={}
keydown=function(e){
    e=e||event
    map[e.keyCode]=true
    if(map[16]&&map[191]){//SHIFT+?
        alert('1) Type your username and password\n\n2) Hit Enter to log in')
        map={}
        return false
    }else if(map[13]){//Enter
        alert('Logging in...')
        map={}
        return false
    }
}
keyup=function(e){
    e=e||event
    map[e.keyCode]=false
}
onkeydown=keydown
onkeyup=keyup//For Regular browsers
try{//for IE
    document.attachEvent('onkeydown',keydown)
    document.attachEvent('onkeyup',keyup)
}catch(e){
    //do nothing
}

请注意,某些特殊键在不同的引擎中具有不同的代码。但是经过我的测试,它可以在我电脑上所有浏览器中正常工作,包括Maxthon 3,Google Chrome,Internet Explorer(9和8)和Firefox。
希望这对您有所帮助。

0

或者类似这样的东西。 var keyCode = e.which || e.keyCode;


0
尝试添加onkeyup事件,并调用相同的函数。
提示: 您可以在doSubmit的开头添加debugger;来设置断点,然后您可以检查keyCode。

有趣的是,在Internet Explorer 8中,即使在這種情況下,“onkeyup”事件也不會被執行。 - Matt McCormick

0

我认为window.Event.keyCode在IE8中可以使用(虽然我现在无法测试)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接