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

IT技术 javascript internet-explorer-8 dom-events
2021-03-15 07:10:34

我在使用我编写的某些 JavaScript 时遇到了问题,但仅限于 Internet Explorer 8。我在 Internet Explorer 7 或更早版本或 Mozilla Firefox 3.5 或更早版本上执行此操作没有问题。当我在 Internet Explorer 8 上使用兼容模式时,它也能正常执行。

当用户在文本框中输入值时,我正在做的是覆盖 Enter 键击。所以在我的元素上,我有这个:

<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,以帮助提高他的声誉。感谢大家!

6个回答

看起来在 IE8keyCodewindow.Eventis属性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();  
}

只是一个预感,试试这个:

var keyCode = e.keyCode ? e.keyCode : e.which;
这适用于 Internet Explorer 8,但不适用于此代码曾经适用的任何其他浏览器。
2021-04-29 07:10:34
克里斯,请看我下面的评论。您的帮助和 Bryan 的帮助解决了这个问题!再次感谢!
2021-05-19 07:10:34

它在我的代码上以这种方式工作:

var kcode = (window.event) ? event.keyCode : event.which;

试试这个:

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

我个人更喜欢多键方法。这允许检测多个键,但也可以检测单个键,并且它适用于我测试过的每个浏览器。

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
}

无论哪种方式都可以正常工作。现在,要实际检测击键,包括错误修复在内的方法是:

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

map[keycode]构成特定的键码,例如13forEnter17for CTRL

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链,这样你就不会得到两个警报Enter,并CTRL+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。

我希望这可以帮到你。