Еще одна версия, понятная и простая, обрабатывает сдвинутые capsLock и не ограничивается ascii, я думаю:
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];
Редактировать: смысл capsLockOn был полностью изменен, дох, исправлено.
Редактирование № 2: После проверки этого я внес несколько изменений, к сожалению, более подробный код, но он обрабатывает больше действий соответствующим образом.
Использование e.charCode вместо e.keyCode и проверка на 0 значений пропускает множество несимвольных нажатий клавиш, не кодируя ничего специфического для данного языка или кодировки. Насколько я понимаю, он немного менее совместим, поэтому старые, неосновные или мобильные браузеры могут вести себя не так, как ожидает этот код, но в любом случае это того стоит.
Проверка по списку известных кодов пунктуации не позволяет им рассматриваться как ложные отрицания, поскольку они не подвержены блокировке заглавными буквами. Без этого индикатор блокировки заглавных букв будет скрыт при вводе любого из этих знаков препинания. Указывая исключенный набор, а не включенный, он должен быть более совместимым с расширенными символами. Это самый уродливый, особенный случайный бит, и есть некоторый шанс, что незападные языки имеют достаточно разные знаки препинания и / или знаки препинания, чтобы быть проблемой, но опять же, это стоит IMO, по крайней мере, для моей ситуации.