2009-11-17 23 views
10

Tengo problemas con algunos JavaScript que he escrito, pero solo con Internet Explorer 8. No tengo problemas para ejecutar esto en Internet Explorer 7 o anterior o en Mozilla Firefox 3.5 o anterior. También se ejecuta correctamente cuando uso el modo de compatibilidad en Internet Explorer 8.JavaScript KeyCode Los valores están "indefinidos" en Internet Explorer 8

Lo que hago es anular la pulsación Enter cuando un usuario introduce un valor en un cuadro de texto. Así que en mi elemento tengo esto:

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

Y luego tengo el siguiente método JavaScript:

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

Una vez más, todo esto funciona bien con casi cualquier otro navegador. Internet Explorer 8 me está haciendo pasar un mal rato.

Cualquier ayuda que pueda tener es muy apreciada. ¡Gracias!

ACTUALIZACIÓN: Gracias a todos por sus comentarios. Tanto Chris Pebble como Bryan Kyle colaboraron con esta solución. Le he otorgado a Bryan la "respuesta" para ayudarlo con su reputación. ¡Gracias a todos!

Respuesta

24

Parece que bajo IE8 la propiedad keyCode de window.Event es undefined pero esa misma característica de window.event (nótese la minúscula e) tiene el valor Puede intentar usar window.event.

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

Pruebe agregar el evento onkeyup también y llame a la misma función.

CONSEJO: Puede agregar debugger; al comienzo de doSubmit para establecer un descanso, luego puede examinar el código de tecla.

+0

Interesante, el "onkeyup" evento no incluso ejecutar en este caso en Internet Explorer 8. –

0

creo window.Event.keyCode obras en IE8 (no puedo probar en este momento, aunque)

7

sólo una corazonada, intente esto:

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

Esto funcionó en Internet Explorer 8, pero no funcionó en ninguno de los otros navegadores en los que este código solía funcionar. –

+0

Chris, por favor mira mi comentario a continuación. ¡Tu ayuda junto con Bryan te ayudó a resolver esto! ¡Gracias de nuevo! –

0

O algo por el estilo. var keyCode = e.which || e.keyCode;

1

Personalmente prefiero el enfoque de varias teclas. Esto permite que se detecten varias claves, pero también una única clave, y funciona en todos los exploradores que he probado.

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 
} 

Un método alternativo sería separar las onkeydown y onkeyup eventos y definir explícitamente los subelementos mapa en cada caso:

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

cualquier manera funciona bien. Ahora, para detectar las pulsaciones de teclado en realidad, el método, incluyendo correcciones de errores, es:

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

map[keycode] constituye un código clave específica, como 13 para Enter, o 17 para CTRL.

La línea map={} se borra el objeto de mapa para evitar que se "espera" en las teclas en los casos de unfocusing, mientras return false impide, por ejemplo, el diálogo Marcadores de aparecer cuando usted comprobar si hay CTRL+D. En algunos casos, es posible que desee reemplazarlo por e.preventDefault(), pero he encontrado que return false es más eficiente en la mayoría de los casos. Solo para obtener una perspectiva clara, pruébalo con CTRL+D. Ctrl es 17, y D es 68. Tenga en cuenta que sin la línea return false, aparecerá el cuadro de diálogo Marcadores.

Algunos ejemplos son los siguientes:

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 
} 

Una cosa a tener en cuenta es que las combinaciones más pequeños deben ir en último lugar. Siempre ponga combinaciones más grandes primero en la cadena if..else, para que no reciba una alerta para Enter y CTRL+ENTER al mismo tiempo.

Ahora, un ejemplo completo para "poner todo junto". Supongamos que desea alertar a un mensaje que contiene instrucciones para iniciar sesión cuando el usuario presiona SHIFT+? e inicie sesión cuando el usuario presione ENTER. Este ejemplo también es compatible con varios navegadores, lo que significa que funciona en IE, también:

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 
} 

Tenga en cuenta que algunas teclas especiales tienen diferentes códigos para diferentes motores. Pero como lo he probado, esto funciona en todos los navegadores que tengo actualmente en mi computadora, incluidos Maxthon 3, Google Chrome, Internet Explorer (9 y 8) y Firefox.

Espero que haya sido útil.

3

Se trabajó en esta forma en mi código:

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

probar esto:

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