Sin embargo, otra versión, clara y simple, maneja mayúsculas mayúsculas y no se limita a ascii, creo:
document.onkeypress = function (e)
{
e = e || window.event;
if (e.charCode === 0 || e.ctrlKey || document.onkeypress.punctuation.indexOf(e.charCode) >= 0)
return;
var s = String.fromCharCode(e.charCode); // or e.keyCode for compatibility, but then have to handle MORE non-character keys
var s2 = e.shiftKey ? s.toUpperCase() : s.toLowerCase();
var capsLockOn = (s2 !== s);
document.getElementById('capslockWarning').style.display = capsLockOn ? '' : 'none';
}
document.onkeypress.punctuation = [33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,91,92,93,94,95,96,123,124,125,126];
Editar: El sentido de capsLockOn fue invertido, doh, corregido
Edición n. ° 2: después de revisar esto un poco más, he realizado algunos cambios, un código un poco más detallado por desgracia, pero maneja más acciones de manera adecuada.
El uso de e.charCode en lugar de e.keyCode y la comprobación de los valores 0 omite muchas pulsaciones de teclas sin caracteres, sin codificar nada específico para un idioma o conjunto de caracteres dado. Según tengo entendido, es un poco menos compatible, por lo que los navegadores más antiguos, no convencionales o móviles pueden no comportarse como este código espera, pero de todos modos vale la pena, para mi situación.
Verificar una lista de códigos de puntuación conocidos evita que sean vistos como falsos negativos, ya que no se ven afectados por el bloqueo de mayúsculas. Sin esto, el indicador de bloqueo de mayúsculas se oculta cuando escribe cualquiera de esos caracteres de puntuación. Al especificar un conjunto excluido, en lugar de uno incluido, debería ser más compatible con los caracteres extendidos. Este es el bit más feo y especial, y hay alguna posibilidad de que los idiomas no occidentales tengan diferentes signos de puntuación y / o códigos de puntuación como para ser un problema, pero nuevamente vale la pena en mi opinión, al menos para mi situación.