我在使用我写的一些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 "答案",以帮助他的声誉。谢谢大家
看起来在IE8下 keyCode
的财产 window.Event
是 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;
在我的代码中,它的工作方式是这样的。
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
}
另一种方法是将 onkeydown
和 onkeyup
事件,并在每个事件中明确定义地图子项。
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
对于 Enter
或 17
对于 CTRL
.
该 map={}
行清除地图对象,以防止它在未聚焦的情况下 "保持 "在键上,而 return false
防止,例如,当你检查是否有书签时,弹出书签对话框 CTRL+D
. 在某些情况下,你可能会想把它替换成 e.preventDefault()
但我发现 return false
在大多数情况下效率更高。为了让大家有一个清晰的认识,可以用以下方法试试 CTRL+D
. Ctrl
是 17
和 D
是 68
. 请注意,如果没有 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
}
需要注意的是,一些特殊的键在不同的引擎上有不同的代码。但是经过我的测试,这个例子可以在我目前电脑上的所有浏览器中使用,包括傲游3、谷歌浏览器、IE(9和8)和火狐。
希望对大家有所帮助。
也可以尝试添加onkeyup事件,并调用同样的函数。
TIP:你可以添加 debugger;
在doSubmit的开头设置一个中断,然后你可以检查keyCode。
我认为 window.Event.keyCode
在IE8中工作(虽然我现在还不能测试
或者类似这样.var keyCode = e.which