Encore une autre version, claire et simple, gère les capsLock décalés, et non contraint à l'ascii je pense:
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];
Edit: le sens de capsLockOn a été inversé, doh, corrigé.
Edit # 2: Après avoir vérifié cela un peu plus, j'ai apporté quelques modifications, un code un peu plus détaillé malheureusement, mais il gère plus d'actions de manière appropriée.
L'utilisation de e.charCode au lieu de e.keyCode et la vérification des valeurs 0 sautent un grand nombre de pressions de touches sans caractère, sans coder quoi que ce soit de spécifique à une langue ou à un jeu de caractères donné. D'après ma compréhension, il est légèrement moins compatible, donc les navigateurs plus anciens, non traditionnels ou mobiles peuvent ne pas se comporter comme le prévoit ce code, mais cela en vaut la peine, pour ma situation de toute façon.
La vérification par rapport à une liste de codes de ponctuation connus les empêche d'être considérés comme de faux négatifs, car ils ne sont pas affectés par le verrouillage des majuscules. Sans cela, l'indicateur de verrouillage des majuscules est masqué lorsque vous tapez l'un de ces caractères de ponctuation. En spécifiant un ensemble exclu, plutôt qu'un inclus, il devrait être plus compatible avec les caractères étendus. C'est le bit le plus laid et le plus casé, et il y a une chance que les langues non occidentales aient suffisamment de codes de ponctuation et / ou de ponctuation différents pour être un problème, mais encore une fois ça vaut le coup IMO, au moins pour ma situation.