| e.keyCode;

问题描述 投票:11回答:8

我在使用我写的一些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();  
}

同样,这在其他浏览器上都能正常工作。只是Internet Explorer 8给我带来了困难。

任何帮助,你可能有非常感激。

更新:感谢大家的快速反馈。Chris Pebble和Bryan Kyle都协助解决了这个问题。我已经授予Bryan "答案",以帮助他的声誉。谢谢大家

javascript internet-explorer-8 dom-events
8个回答
25
投票

看起来在IE8下 keyCode 的财产 window.Eventundefined 但同样的属性 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;

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
}

另一种方法是将 onkeydownonkeyup 事件,并在每个事件中明确定义地图子项。

map={}
onkeydown=function(e){
    e=e||event
    map[e.keyCode]=true
}
onkeyup=function(e){
    e=e||event
    map[e.keyCode]=false
}

两种方法都可以用 现在,要实际检测按键,方法,包括bug修复,是。

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

map[keycode] 构成一个特定的键码,比如 13 对于 Enter17 对于 CTRL.

map={} 行清除地图对象,以防止它在未聚焦的情况下 "保持 "在键上,而 return false 防止,例如,当你检查是否有书签时,弹出书签对话框 CTRL+D. 在某些情况下,你可能会想把它替换成 e.preventDefault()但我发现 return false 在大多数情况下效率更高。为了让大家有一个清晰的认识,可以用以下方法试试 CTRL+D. Ctrl17D68. 请注意,如果没有 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
}

需要注意的是,一些特殊的键在不同的引擎上有不同的代码。但是经过我的测试,这个例子可以在我目前电脑上的所有浏览器中使用,包括傲游3、谷歌浏览器、IE(9和8)和火狐。

希望对大家有所帮助。


0
投票

也可以尝试添加onkeyup事件,并调用同样的函数。

TIP:你可以添加 debugger; 在doSubmit的开头设置一个中断,然后你可以检查keyCode。


0
投票

我认为 window.Event.keyCode 在IE8中工作(虽然我现在还不能测试


0
投票

或者类似这样.var keyCode = e.which

© www.soinside.com 2019 - 2024. All rights reserved.