Một phiên bản khác, rõ ràng và đơn giản, xử lý capsLock đã dịch chuyển và không bị ràng buộc với ascii tôi nghĩ:
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];
Chỉnh sửa: Cảm giác của capsLockOn đã bị đảo ngược, doh, đã sửa.
Chỉnh sửa # 2: Sau khi kiểm tra thêm điều này, tôi đã thực hiện một vài thay đổi, không may là mã chi tiết hơn một chút, nhưng nó xử lý nhiều hành động phù hợp hơn.
Sử dụng e.charCode thay vì e.keyCode và kiểm tra 0 giá trị bỏ qua rất nhiều phím bấm không có ký tự, mà không mã hóa bất cứ thứ gì cụ thể cho một ngôn ngữ hoặc bảng mã cụ thể. Theo hiểu biết của tôi, nó hơi kém tương thích, vì vậy các trình duyệt di động cũ hơn, không chính thống hoặc di động có thể không hoạt động như mã này mong đợi, nhưng dù sao nó cũng đáng giá, đối với tình huống của tôi.
Việc kiểm tra danh sách các mã chấm câu đã biết sẽ ngăn không cho chúng bị coi là phủ định sai, vì chúng không bị ảnh hưởng bởi khóa mũ. Không có điều này, chỉ báo khóa mũ sẽ bị ẩn khi bạn nhập bất kỳ ký tự dấu chấm câu nào. Bằng cách chỉ định một bộ loại trừ, thay vì một bộ được bao gồm, nó sẽ tương thích hơn với các ký tự mở rộng. Đây là bit xấu nhất, đặc biệt nhất và có một số khả năng các ngôn ngữ ngoài phương Tây có đủ dấu chấm câu và / hoặc dấu chấm câu khác nhau là một vấn đề, nhưng một lần nữa, nó đáng để IMO, ít nhất là đối với tình huống của tôi.