Ancora un'altra versione, chiara e semplice, gestisce maiusc Maiusc e non vincolato ad ascii Penso:
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];
Modifica: senso di capsLockOn è stato invertito, doh, risolto.
Modifica n. 2: dopo aver verificato questo un po 'di più, ho apportato alcune modifiche, un po' di codice un po 'più dettagliato, ma gestisce più azioni in modo appropriato.
L'uso di e.charCode invece di e.keyCode e il controllo di 0 valori salta molti tasti senza caratteri, senza codificare nulla di specifico per una determinata lingua o set di caratteri. Da quanto ho capito, è leggermente meno compatibile, quindi i browser più vecchi, non tradizionali o mobili potrebbero non comportarsi come previsto da questo codice, ma ne vale la pena, comunque per la mia situazione.
Il confronto con un elenco di codici di punteggiatura noti impedisce loro di essere visti come falsi negativi, poiché non sono interessati dal blocco maiuscole. Senza questo, l'indicatore di blocco maiuscole viene nascosto quando si digita uno di quei caratteri di punteggiatura. Specificando un set escluso, anziché uno incluso, dovrebbe essere più compatibile con i caratteri estesi. Questa è la parte più brutta, in casi speciali, e c'è qualche possibilità che le lingue non occidentali abbiano punteggiatura e / o codici di punteggiatura abbastanza diversi da essere un problema, ma ancora una volta vale la pena IMO, almeno per la mia situazione.