Jeszcze inna wersja, przejrzysta i prosta, obsługuje przesunięte czapki Lock, i nie jest ograniczona do ascii, myślę:
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];
Edycja: Poczucie capsLockOn zostało odwrócone, doh, naprawione.
Edycja nr 2: Po sprawdzeniu tego jeszcze trochę, wprowadziłem kilka zmian, nieco bardziej szczegółowy kod, niestety, ale odpowiednio obsługuje więcej akcji.
Użycie e.charCode zamiast e.keyCode i sprawdzenie wartości 0 pomija wiele naciśnięć znaków innych niż znaki, bez kodowania czegokolwiek konkretnego dla danego języka lub zestawu znaków. Z mojego zrozumienia, jest nieco mniej kompatybilny, więc starsze, niemainstreamowe lub mobilne przeglądarki mogą nie zachowywać się tak, jak tego oczekuje kod, ale i tak warto, w mojej sytuacji.
Sprawdzanie na liście znanych kodów interpunkcyjnych zapobiega ich postrzeganiu jako fałszywych negatywów, ponieważ nie ma na nich wpływu Caps Lock. Bez tego wskaźnik Caps Lock zostaje ukryty po wpisaniu dowolnego z tych znaków interpunkcyjnych. Określając zestaw wykluczony, a nie dołączony, powinien być bardziej kompatybilny z rozszerzonymi znakami. Jest to najbrzydszy, szczególnie kasowy bit, i istnieje szansa, że języki inne niż zachodnie mają wystarczająco różne kody interpunkcyjne i / lub interpunkcyjne, aby stanowić problem, ale znowu warto IMO, przynajmniej w mojej sytuacji.