Ще одна версія, чітка і проста, ручки зміщені 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, принаймні для моєї ситуації.