さらに別のバージョンは、明快でシンプルで、シフトされた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.keyCodeの代わりにe.charCodeを使用し、0の値をチェックすると、特定の言語または文字セットに固有のコードを記述せずに、多くの非文字キープレスがスキップされます。私の理解では、互換性は少し低いため、古い、非メインストリーム、またはモバイルブラウザーは、このコードが期待するとおりに動作しない可能性がありますが、いずれにしても、私の状況では価値があります。
既知の句読コードのリストをチェックすると、大文字のロックの影響を受けないため、誤検出と見なされなくなります。これがないと、句読点文字を入力すると、Caps Lockインジケーターが非表示になります。含まれるセットではなく、除外されたセットを指定することにより、拡張文字との互換性が向上します。これは最も醜く、特別なケースであり、非西洋言語では問題になるほど十分に異なる句読点や句読点コードがある可能性がありますが、少なくとも私の状況ではIMOの価値があります。