Как узнать, включен ли Caps Lock с помощью JavaScript?

Как узнать, включен ли Caps Lock с помощью JavaScript?

Однако одно предостережение: я сделал это в Google, и лучшее решение, которое я смог найти, - это прикрепить событие onkeypress к каждому входу, а затем каждый раз проверять, была ли нажатая буква прописной, и если это так, то проверяйте, удерживается ли также shift. Если это не так, значит, должна быть включена фиксация заглавных букв. Это кажется действительно грязным и просто ... расточительный - неужели есть способ лучше, чем этот?

Просто из любопытства, почему вы хотите обнаруживать Caps Lock в веб-приложении?

Chetan S 22.05.2009 10:14

ПОТОМУ ЧТО СЛИШКОМ МНОГИЕ МОИ ПОЛЬЗОВАТЕЛИ ЗАПОЛНЯЮТ СВОИ ФОРМЫ ТАК.

nickf 22.05.2009 12:40

@nicf: Если это причина, почему бы вам не запустить регулярное выражение на входе и не попросить их перестать кричать, если в них слишком много заглавных букв?

some 29.09.2010 00:08

Для этого есть гораздо лучшая причина. Если пользователь вводит пароль, было бы очень полезно предупредить его, если у него включен Capslock.

T Nguyen 11.06.2011 12:14

Я отказался от попыток заставить пользователей вводить данные в нижнем регистре и всегда отображать текст, используя регистр заголовка, нижний регистр или регистр предложений, в зависимости от ситуации. Обратите внимание, что коды стран (US), почтовые индексы (M5W 1E6) и номера телефонов (KL5-0912) должны отображаться в верхнем регистре, даже если они были введены в нижнем регистре. Редактировать«Просто набери алмаз, D-I-A-M-O-N-D».

Ian Boyd 25.04.2012 19:00

Похоже, браузеры должны реализовать предупреждение "Caps Lock включен", когда пользователи вводят данные в поля input type=password (аналогично проверке адреса электронной почты для input type=email в Chrome и т. д.)

nothingisnecessary 02.09.2014 23:59

Отличный вопрос, но принятый ответ - 8 лет. Лучший ответ - здесь

Mac 06.04.2017 19:09

@Mac Далее Райан Марин опубликовал обновленный (по состоянию на сентябрь 2018 г.) метод, который отлично сработал для меня. См. его ответ здесь. Ваше здоровье!

Sirtastic 20.09.2018 10:15

@Sirtastic: Да, они оба проверяют наличие event.getModifierState( 'CapsLock' ). Потрясающий!

Mac 20.09.2018 21:47

Спасибо за ваши комментарии, потому что я подумал ... Почему принятый ответ - это то, что спрашивающий не хотел делать?

Tupac 02.05.2020 05:44
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
246
10
111 707
31
Перейти к ответу Данный вопрос помечен как решенный

Ответы 31

Ответ принят как подходящий

Можете попробовать .. Добавил рабочий пример. Когда фокус находится на вводе, при включении Caps Lock индикатор становится красным, в противном случае - зеленым. (Не тестировалось на Mac / Linux)

ПРИМЕЧАНИЕ: у меня работают обе версии. Спасибо за конструктивный вклад в комментарии.

СТАРАЯ ВЕРСИЯ: https://jsbin.com/mahenes/edit?js,output

Также вот модифицированная версия (может кто-нибудь протестировать на Mac и подтвердить)

НОВАЯ ВЕРСИЯ: https://jsbin.com/xiconuv/edit?js,output

НОВАЯ ВЕРСИЯ:

function isCapslock(e) {
  const IS_MAC = /Mac/.test(navigator.platform);

  const charCode = e.charCode;
  const shiftKey = e.shiftKey;

  if (charCode >= 97 && charCode <= 122) {
    capsLock = shiftKey;
  } else if (charCode >= 65 && charCode <= 90
    && !(shiftKey && IS_MAC)) {
    capsLock = !shiftKey;
  }

  return capsLock;
}

СТАРАЯ ВЕРСИЯ:

function isCapslock(e) {
  e = (e) ? e : window.event;

  var charCode = false;
  if (e.which) {
    charCode = e.which;
  } else if (e.keyCode) {
    charCode = e.keyCode;
  }

  var shifton = false;
  if (e.shiftKey) {
    shifton = e.shiftKey;
  } else if (e.modifiers) {
    shifton = !!(e.modifiers & 4);
  }

  if (charCode >= 97 && charCode <= 122 && shifton) {
    return true;
  }

  if (charCode >= 65 && charCode <= 90 && !shifton) {
    return true;
  }

  return false;
}

Для международных символов при необходимости можно добавить дополнительную проверку для следующих ключей. Вы должны получить диапазон кодов клавиш для интересующих вас символов, возможно, используя массив сопоставления клавиш, который будет содержать все допустимые ключи варианта использования, к которым вы обращаетесь ...

прописные A-Z или 'Ä', 'Ö', 'Ü', строчные буквы A-Z или 0-9 или 'ä', 'ö', 'ü'

Вышеупомянутые ключи являются всего лишь примером представления.

Возможно, это не лучшая реализация, но когда я ее писал, я старался не усложнять. Я думаю, это единственный способ сделать это с той мерзостью, которую нужно скрывать для разных браузеров.

user67627 10.12.2009 13:29

Я обнаружил, что использование этого с keydown (в хроме) приводит к тому, что все коды отображаются как заглавные. Если я использую нажатие клавиш, это работает.

Tim 26.03.2014 16:25

Поиск каждой возможной комбинации символов для всех международных символов обречен на упущение некоторых случаев. Вместо этого используйте методы toUpper / Lower case для проверки регистра.

awe 11.06.2015 12:54

Удивительно, но совершенно ложный ответ - вводящие в заблуждение кодировки и ascii (!!!) - может получить столько голосов. Никто еще не проверял ???

GameAlchemist 03.11.2015 23:55

@GameAlchemist этот код работает только в событии keypress, когда значение делаетcharCode соответствует значениям ASCII.

Mottie 15.12.2015 01:08

Обратите внимание, что согласно Mozilla, event. который был удален из веб-стандартов.

verism 18.02.2016 13:03

Ответ Диего Виейры ниже должен быть принятым ответом в настоящее время. Этот очень старый и содержит устаревший код

chezwhite 09.05.2018 14:32

@chezwhite и другие. Да, ответ очень старый и, как ни странно, снова наткнулся на это после 6 лет публикации. Но также используется e.which, только если он поддерживается, иначе он вернется к e.keyCode. Так что технически это все еще будет работать, но я также опубликую обновление. Спасибо.

rajesh pillai 21.12.2019 09:32

@rajeshpillai: не работает на реальном устройстве Android в мобильном браузере!

Aniruddha Shevle 15.03.2021 09:27

В jQuery:

$('some_element').keypress(function(e){
       if (e.keyCode == 20){
             //caps lock was pressed
       }
});

Этот плагин jQuery (код) реализует ту же идею, что и в Ответ Раджеша, немного более лаконично.

это определит, если вы нажмете Caps Lock (даже если вы его выключите), а не то, включен он или нет.

nickf 08.12.2008 09:37

правильный. Я все еще пытаюсь выяснить, есть ли более чистый способ сделать это, чем то, что указано в сообщении в блоге, указанном выше.

rz. 08.12.2008 09:48

Похоже, что это можно было бы использовать для проверки ограничения и сдвига, и это было бы немного менее расточительно, поскольку оно привязано к одному элементу, например, к полю пароля ...

Eli 09.12.2008 03:42

Вы можете определить фиксацию заглавных букв, используя «прописные буквы без нажатия клавиши Shift», используя захват нажатия клавиш на документе. Но тогда вам лучше быть уверенным, что никакой другой обработчик нажатия клавиш не выскочит из пузыря событий, прежде чем он попадет в обработчик документа.

document.onkeypress = function ( e ) {
  e = e || window.event;
  var s = String.fromCharCode( e.keyCode || e.which );
  if ( (s.toUpperCase() === s) !== e.shiftKey ) {
    // alert('caps is on')
  }
}

Вы можете захватить событие во время фазы захвата в браузерах, которые это поддерживают, но это кажется бессмысленным, поскольку оно не будет работать во всех браузерах.

Я не могу придумать другого способа действительно определить статус Caps Lock. Проверка в любом случае проста, и если были набраны неопределяемые символы, ну ... тогда в обнаружении не было необходимости.

В прошлом году было статья о 24 способах. Неплохо, но отсутствует поддержка международных символов (используйте toUpperCase(), чтобы обойти это).

На самом деле это то, что я искал. Это работает с латиницей и кириллицей. Спасибо!

Mladen Janjetovic 26.12.2013 17:30

Это хорошо работает, но такие клавиши, как ПРОБЕЛ и цифры, указывают на предупреждение. Знаете обходной путь (такой же краткий / элегантный)?

user241244 15.01.2014 23:34

Также хорошо, что вы отметили неполноту, но она все еще не завершена. Не знаю, как исправить это с помощью этого метода.

user241244 16.01.2014 00:38

@Bordar: не работает на реальном устройстве Android в мобильном браузере!

Aniruddha Shevle 22.03.2021 07:56

В jQuery

$('#example').keypress(function(e) { 
    var s = String.fromCharCode( e.which );
    if ( s.toUpperCase() === s && s.toLowerCase() !== s && !e.shiftKey ) {
        alert('caps is on');
    }
});

Избегайте ошибки, как и клавиша backspace, нужен s.toLowerCase() !== s.

на самом деле ... fromCharCode избавил меня от необходимости даже проверять. однако следует отметить, что keydown и keypress дают разные символы, и именно в этом я изначально ошибся.

Shea 08.11.2011 01:24

-1 bc это работает ТОЛЬКО если они не нажимали Shift при включенном CAPS.

user241244 16.01.2014 00:36

Если кто-то хочет увидеть живой пример с начальной загрузкой, вы можете просмотреть здесь bootply.com/91792

Govinda Rajbhar 22.01.2016 16:28

Этот ответ был мне полезен. Я улучшил условное выражение в этот ответ из-за недостатка, упомянутого @D_N, что он не работает при нажатии Shift.

SebasSBM 17.07.2018 18:15

но что, если он включен только при загрузке документа?

TAHA SULTAN TEMURI 20.01.2021 20:58

В JQuery. Это охватывает обработку событий в Firefox и проверяет наличие неожиданных символов верхнего и нижнего регистра. Это предполагает наличие элемента <input id = "password" type = "password" name = "whatever"/> и отдельного элемента с идентификатором «capsLockWarning», в котором есть предупреждение, которое мы хотим показать (но в противном случае он скрыт).

$('#password').keypress(function(e) {
    e = e || window.event;

    // An empty field resets the visibility.
    if (this.value === '') {
        $('#capsLockWarning').hide();
        return;
    }

    // We need alphabetic characters to make a match.
    var character = String.fromCharCode(e.keyCode || e.which);
    if (character.toUpperCase() === character.toLowerCase()) {
        return;
    }

    // SHIFT doesn't usually give us a lowercase character. Check for this
    // and for when we get a lowercase character when SHIFT is enabled. 
    if ((e.shiftKey && character.toLowerCase() === character) ||
        (!e.shiftKey && character.toUpperCase() === character)) {
        $('#capsLockWarning').show();
    } else {
        $('#capsLockWarning').hide();
    }
});

Не знаю почему, но этот метод не работает при первом нажатии клавиши (проверено только в Chrome).

user241244 15.01.2014 14:19

Может быть проблема с скрытием пустого поля? Я не мог заставить это работать правильно, по крайней мере, в Chrome. Это автоматически происходит во многих других браузерах (по крайней мере, в моей версии ниже), потому что количество обратных пространств и гашение mssg.

user241244 16.01.2014 03:13
Примечание: как вы правильно использовали здесь, вам нужно использовать событие keypress, чтобы использовать разные регистры на входе, потому что оба keydown и keyup всегда будут возвращать заглавные буквы.. Следовательно, это не будет выстрелить ключом Capslock ... если вы намеревались объединить с e.originalEvent.getModifierState('CapsLock')
KyleMit 20.02.2018 23:54

В приведенном ниже коде будет отображаться предупреждение, когда Caps Lock включен, и они нажимают клавишу с помощью Shift.

если мы вернем false; тогда текущий символ не будет добавлен на текстовую страницу.

$('#password').keypress(function(e) { 
    // e.keyCode is not work in FF, SO, it will
    // automatically get the value of e.which.  
    var s = String.fromCharCode( e.keyCode || e.which );
    if ( s.toUpperCase() === s && s.toLowerCase() !== s && !e.shiftKey ) {
            alert('caps is on');
            return false;
    }
else  if ( s.toUpperCase() !== s) {
            alert('caps is on and Shiftkey pressed');
            return false;
    }
});

Работает только при включенном Caps Lock. Если Caps Lock выключен, он по-прежнему сообщает, что Caps Lock включен, но с нажатой клавишей Shift (как с нажатой клавишей Shift, так и без нее).

awe 10.02.2014 15:43

Хорошо, извините за это @awe

Naga Harish M 10.02.2014 17:38

Я знаю, что это старая тема, но подумал, что отвечу, если она поможет другим. Кажется, что ни один из ответов на вопрос не работает в IE8. Однако я нашел этот код, который работает в IE8. (Еще не тестировал что-либо ниже IE8). При необходимости его можно легко изменить для jQuery.

function capsCheck(e,obj){ 
    kc = e.keyCode?e.keyCode:e.which;  
    sk = e.shiftKey?e.shiftKey:((kc == 16)?true:false);  
    if (((kc >= 65 && kc <= 90) && !sk)||((kc >= 97 && kc <= 122) && sk)){
        document.getElementById('#'+obj.id).style.visibility = 'visible';
    } 
    else document.getElementById('#'+obj.id).style.visibility = 'hidden';
}

И функция вызывается через событие onkeypress следующим образом:

<input type = "password" name = "txtPassword" onkeypress = "capsCheck(event,this);" />
<div id = "capsWarningDiv" style = "visibility:hidden">Caps Lock is on.</div> 

Спасибо за исправление IE8. Включил это в свой переработанный ответ (ниже). Хотя это твердо.

user241244 16.01.2014 03:14

Когда вы печатаете, если caplock включен, он может автоматически преобразовать текущий символ в нижний регистр. Таким образом, даже если Caplocks включена, он не будет вести себя так, как на текущей странице. Чтобы проинформировать своих пользователей, вы можете отобразить текст о том, что блокировка включена, но записи формы преобразованы.

Да, но тогда вам все равно нужно будет обнаруживать Caps Lock. Кроме того, это означает, что вы запрещаете использовать верхний регистр в паролях, что является неоптимальным.

Dave Liepmann 20.04.2012 18:49

чтобы определить, включен ли Caps Lock, вы должны проверить, отличается ли строчная версия отправленного вами символа от него, если это -> caps lock, затем «Предупреждение: вы используете Caps Lock, но наша система конвертируется в нижний регистр », я полагаю, javascript не предназначен для обнаружения Caps Lock в конце концов (проверка Caps Lock требует доступа к системе), вы должны найти способ, который лучше всего соответствует вашим потребностям

Frederik.L 22.10.2012 21:53

попробуйте этот простой код в легком для понимания

Это сценарий

 <script language = "Javascript">
function capLock(e){
 kc = e.keyCode?e.keyCode:e.which;
 sk = e.shiftKey?e.shiftKey:((kc == 16)?true:false);
 if (((kc >= 65 && kc <= 90) && !sk)||((kc >= 97 && kc <= 122) && sk))
  document.getElementById('divMayus').style.visibility = 'visible';
 else
   document.getElementById('divMayus').style.visibility = 'hidden';
}
</script>

И HTML

<input type = "password" name = "txtPassword" onkeypress = "capLock(event)" />
 <div id = "divMayus" style = "visibility:hidden">Caps Lock is on.</div> 

Недавно на hashcode.com был аналогичный вопрос, и я создал плагин jQuery для борьбы с ним. Он также поддерживает распознавание заглавных букв в числах. (На стандартной немецкой раскладке клавиатуры Caps Lock влияет на числа).

Вы можете проверить последнюю версию здесь: jquery.capsChecker

Многие существующие ответы будут проверять включение Caps Lock, когда shift не нажата, но не будут проверять его, если вы нажмете shift и получите строчные буквы, или будут проверять это, но также не будут проверять отключение Caps Lock, или будут проверять это, но будет рассматривать не-альфа-ключи как "выключенные". Вот адаптированное решение jQuery, которое покажет предупреждение, если альфа-клавиша нажата с заглавными буквами (сдвиг или без сдвига), отключит предупреждение, если альфа-клавиша нажата без заглавных букв, но не будет отключать или включать предупреждение, когда цифры или другие клавиши.

$("#password").keypress(function(e) { 
    var s = String.fromCharCode( e.which );
    if ((s.toUpperCase() === s && s.toLowerCase() !== s && !e.shiftKey)|| //caps is on
      (s.toUpperCase() !== s && s.toLowerCase() === s && e.shiftKey)) {
        $("#CapsWarn").show();
    } else if ((s.toLowerCase() === s && s.toUpperCase() !== s && !e.shiftKey)||
      (s.toLowerCase() !== s && s.toUpperCase() === s && e.shiftKey)) { //caps is off
        $("#CapsWarn").hide();
    } //else upper and lower are both same (i.e. not alpha key - so do not hide message if already on but do not turn on if alpha keys not hit yet)
  });

Лучшие ответы здесь не сработали для меня по нескольким причинам (код без комментариев с мертвой ссылкой и неполное решение). Так что я потратил несколько часов на то, чтобы пробовать всех и стараться изо всех сил: вот мои, включая jQuery и не jQuery.

jQuery

Обратите внимание, что jQuery нормализует объект события, поэтому некоторые проверки отсутствуют. Я также сузил его до всех полей пароля (так как это самая большая причина в нем) и добавил предупреждающее сообщение. Это было протестировано в Chrome, Mozilla, Opera и IE6-8. Стабильный и улавливает все состояния Capslock, ЗА ИСКЛЮЧЕНИЕМ нажатия цифр или пробелов.

/* check for CAPS LOCK on all password fields */
$("input[type='password']").keypress(function(e) {

    var $warn = $(this).next(".capsWarn"); // handle the warning mssg
    var kc = e.which; //get keycode
    var isUp = (kc >= 65 && kc <= 90) ? true : false; // uppercase
    var isLow = (kc >= 97 && kc <= 122) ? true : false; // lowercase
    // event.shiftKey does not seem to be normalized by jQuery(?) for IE8-
    var isShift = ( e.shiftKey ) ? e.shiftKey : ( (kc == 16) ? true : false ); // shift is pressed

    // uppercase w/out shift or lowercase with shift == caps lock
    if ( (isUp && !isShift) || (isLow && isShift) ) {
        $warn.show();
    } else {
        $warn.hide();
    }

}).after("<span class='capsWarn error' style='display:none;'>Is your CAPSLOCK on?</span>");

Без jQuery

В некоторых других решениях без jQuery отсутствовали резервные варианты IE. @Zappa исправил это.

document.onkeypress = function ( e ) {
    e = (e) ? e : window.event;

    var kc = ( e.keyCode ) ? e.keyCode : e.which; // get keycode
    var isUp = (kc >= 65 && kc <= 90) ? true : false; // uppercase
    var isLow = (kc >= 97 && kc <= 122) ? true : false; // lowercase
    var isShift = ( e.shiftKey ) ? e.shiftKey : ( (kc == 16) ? true : false ); // shift is pressed -- works for IE8-

    // uppercase w/out shift or lowercase with shift == caps lock
    if ( (isUp && !isShift) || (isLow && isShift) ) {
        alert("CAPSLOCK is on."); // do your thing here
    } else {
        // no CAPSLOCK to speak of
    }

}

Примечание. Ознакомьтесь с решениями @Borgar, @Joe Liversedge и @Zappa, а также с плагином, разработанным @Pavel Azanov, который я не пробовал, но это хорошая идея. Если кто-то знает способ расширить сферу охвата за пределы А-За-Я, пожалуйста, отредактируйте. Кроме того, jQuery-версии этого вопроса закрыты как дубликаты, поэтому я публикую здесь оба.

Хорошее решение всегда должно включать поддержку букв, отличных от английских букв A-Z. Любое другое решение - оскорбление почти для всех неанглийских языков.

awe 10.02.2014 16:34

Не работает на реальном устройстве Android в мобильном браузере!

Aniruddha Shevle 22.03.2021 07:59

Этот код обнаруживает блокировку заглавных букв независимо от случая или нажатия клавиши Shift:

$('#password').keypress(function(e) { 
    var s = String.fromCharCode( e.which );
    if ( (s.toUpperCase() === s && !e.shiftKey) || 
             (s.toLowerCase() === s && e.shiftKey) ) {
        alert('caps is on');
    }
});

Это заставляет пробел и обратное пространство распознаваться как верхний регистр в Firefox.

Adrian Rosca 17.10.2014 14:08

Это решение, которое, помимо проверки состояния при записи, также переключает предупреждающее сообщение при каждом нажатии клавиши Caps Lock (с некоторыми ограничениями).

Он также поддерживает неанглийские буквы за пределами диапазона A-Z, поскольку он проверяет символ строки на toUpperCase() и toLowerCase() вместо проверки на диапазон символов.

$(function(){
  //Initialize to hide caps-lock-warning
  $('.caps-lock-warning').hide();

  //Sniff for Caps-Lock state
  $("#password").keypress(function(e) {
    var s = String.fromCharCode( e.which );
    if ((s.toUpperCase() === s && s.toLowerCase() !== s && !e.shiftKey)||
       (s.toUpperCase() !== s && s.toLowerCase() === s && e.shiftKey)) {
      this.caps = true; // Enables to do something on Caps-Lock keypress
      $(this).next('.caps-lock-warning').show();
    } else if ((s.toLowerCase() === s && s.toUpperCase() !== s && !e.shiftKey)||
              (s.toLowerCase() !== s && s.toUpperCase() === s && e.shiftKey)) {
      this.caps = false; // Enables to do something on Caps-Lock keypress
      $(this).next('.caps-lock-warning').hide();
    }//else else do nothing if not a letter we can use to differentiate
  });

  //Toggle warning message on Caps-Lock toggle (with some limitation)
  $(document).keydown(function(e){
    if (e.which==20){ // Caps-Lock keypress
      var pass = document.getElementById("password");
      if (typeof(pass.caps) === 'boolean'){
        //State has been set to a known value by keypress
        pass.caps = !pass.caps;
        $(pass).next('.caps-lock-warning').toggle(pass.caps);
      }
    }
  });

  //Disable on window lost focus (because we loose track of state)
  $(window).blur(function(e){
    // If window is inactive, we have no control on the caps lock toggling
    // so better to re-set state
    var pass = document.getElementById("password");
    if (typeof(pass.caps) === 'boolean'){
      pass.caps = null;
      $(pass).next('.caps-lock-warning').hide();
    }
  });
});
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type = "password" id = "password" />
<span class = "caps-lock-warning" title = "Caps lock is on!">CAPS</span>

Обратите внимание, что наблюдение за переключением Caps Lock полезно только в том случае, если мы знаем состояние Caps Lock до нажатия клавиши Caps Lock. Текущее состояние Caps Lock сохраняется с помощью свойства JavaScript caps в элементе пароля. Это устанавливается в первый раз, когда у нас есть проверка состояния Caps Lock, когда пользователь нажимает букву, которая может быть в верхнем или нижнем регистре. Если окно теряет фокус, мы больше не можем наблюдать переключение Caps Lock, поэтому нам нужно выполнить сброс до неизвестного состояния.

Хорошая идея. Если вы собираетесь показать пользователю предупреждение о том, что Caps Lock включен, вероятно, неплохо сразу отключить это предупреждение, когда Caps Lock отключен, иначе вы можете запутать пользователя.

Ajedi32 10.06.2015 17:22

попробуйте использовать этот код.

$('selectorOnTheInputTextBox').keypress(function (e) {
        var charCode = e.target.value.charCodeAt(e.target.value.length - 1)
        var capsOn = 
            e.keyCode && 
            !e.shiftKey &&
            !e.ctrlKey &&
            charCode >= 65 && 
            charCode <= 90;

            if (capsOn) 
               //action if true
            else
               //action if false
});

Удачи :)

Я написал библиотеку под названием capsLock, которая делает именно то, что вы хотите.

Просто включите его на свои веб-страницы:

<script src = "https://rawgit.com/aaditmshah/capsLock/master/capsLock.js"></script>

Затем используйте его следующим образом:

alert(capsLock.status);

capsLock.observe(function (status) {
    alert(status);
});

См. Демонстрацию: http://jsfiddle.net/3EXMd/

Статус обновляется при нажатии клавиши Caps Lock. Он использует только взлом Shift, чтобы определить правильный статус клавиши Caps Lock. Изначально статус - false. Так что будьте осторожны.

Это действительно гениальное решение. Но у него есть ошибка, заключающаяся в том, что если Caps Lock включен, когда страница получает фокус, объект «capslock» запускается с неправильным состоянием (выключено).

Ric 12.08.2014 12:43

На самом деле все начинается с неправильного состояния. Однако когда вы нажимаете любую клавишу, она автоматически корректирует свое состояние. Если вы можете найти способ установить его в правильное состояние, когда страница получает фокус, я был бы более чем счастлив объединить ваш код.

Aadit M Shah 12.08.2014 14:19

Еще одна версия, ясная и простая, обрабатывает сдвинутый 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 пропускает множество несимвольных нажатий клавиш без кодирования чего-либо, специфичного для данного языка или кодировки. Насколько я понимаю, он немного менее совместим, поэтому старые, неосновные или мобильные браузеры могут вести себя не так, как ожидает этот код, но в моей ситуации оно того стоит.

  • Проверка по списку известных кодов пунктуации предотвращает их рассмотрение как ложноотрицательные, поскольку на них не влияет блокировка заглавных букв. Без этого индикатор заглавных букв будет скрыт при вводе любого из этих знаков пунктуации. Если указать исключенный набор, а не включенный, он должен быть более совместим с расширенными символами. Это самый уродливый, особенный момент, и есть некоторая вероятность, что у незападных языков достаточно разных знаков препинания и / или знаков препинания, чтобы стать проблемой, но опять же, это того стоит, ИМО, по крайней мере, для моей ситуации.

Для jQuery с загрузкой twitter

Проверьте заглавные буквы для следующих символов:

прописные буквы AZ или 'Ä', 'Ö', 'Ü', '!', '"', '§', '$', '%', '&', '/', '(', ')' знак равно

строчные буквы A-Z или 0-9 или 'ä', 'ö', 'ü', '.', ',', '+', '#'

/* check for CAPS LOCK on all password fields */
$("input[type='password']").keypress(function(e) {
    var kc = e.which; // get keycode

    var isUpperCase = ((kc >= 65 && kc <= 90) || (kc >= 33 && kc <= 34) || (kc >= 36 && kc <= 39) || (kc >= 40 && kc <= 42) || kc == 47 || (kc >= 58 && kc <= 59) || kc == 61 || kc == 63 || kc == 167 || kc == 196 || kc == 214 || kc == 220) ? true : false; // uppercase A-Z or 'Ä', 'Ö', 'Ü', '!', '"', '§', '$', '%', '&', '/', '(', ')', '=', ':', ';'
    var isLowerCase = ((kc >= 97 && kc <= 122) || (kc >= 48 && kc <= 57) || kc == 35 || (kc >= 43 && kc <= 44) || kc == 46 || kc == 228 || kc == 223 || kc == 246 || kc == 252) ? true : false; // lowercase a-Z or 0-9 or 'ä', 'ö', 'ü', '.', ','

    // event.shiftKey does not seem to be normalized by jQuery(?) for IE8-
    var isShift = (e.shiftKey) ? e.shiftKey : ((kc == 16) ? true : false); // shift is pressed

    // uppercase w/out shift or lowercase with shift == caps lock
    if ((isUpperCase && !isShift) || (isLowerCase && isShift)) {
        $(this).next('.form-control-feedback').show().parent().addClass('has-warning has-feedback').next(".capsWarn").show();
    } else {
        $(this).next('.form-control-feedback').hide().parent().removeClass('has-warning has-feedback').next(".capsWarn").hide();
    }
}).after('<span class = "glyphicon glyphicon-warning-sign form-control-feedback" style = "display:none;"></span>').parent().after("<span class='capsWarn text-danger' style='display:none;'>Is your CAPSLOCK on?</span>");

живая демонстрация на jsfiddle

Не работает на реальном устройстве Android в мобильном браузере!

Aniruddha Shevle 22.03.2021 08:07

Вы можете использовать этот сценарий. Он должен хорошо работать в Windows, даже если нажата клавиша Shift, но в этом случае он не будет работать в Mac OS.

На основе ответа @joshuahedlund, поскольку он отлично работал у меня.

Я сделал код функцией, чтобы его можно было использовать повторно, и связал его с телом в моем случае. Его можно связать с полем пароля, только если хотите.

<html>
<head>
<script language = "javascript" type = "text/javascript" >
function checkCapsLock(e, divId) { 
    if (e){
        e = e;
    } else {
        e = window.event;
    }
    var s = String.fromCharCode( e.which );
    if ((s.toUpperCase() === s && s.toLowerCase() !== s && !e.shiftKey)|| //caps is on
      (s.toUpperCase() !== s && s.toLowerCase() === s && e.shiftKey)) {
        $(divId).style.display='block';
    } else if ((s.toLowerCase() === s && s.toUpperCase() !== s && !e.shiftKey)||
      (s.toLowerCase() !== s && s.toUpperCase() === s && e.shiftKey)) { //caps is off
        $(divId).style.display='none';
   } //else upper and lower are both same (i.e. not alpha key - so do not hide message if already on but do not turn on if alpha keys not hit yet)
 }
</script>
<style>    
.errorDiv {
    display: none;
    font-size: 12px;
    color: red;
    word-wrap: break-word;
    text-overflow: clip;
    max-width: 200px;
    font-weight: normal;
}
</style>
</head>
<body  onkeypress = "checkCapsLock(event, 'CapsWarn');" >
...
<input name = "password" id = "password" type = "password" autocomplete = "off">
<div id = "CapsWarn" class = "errorDiv">Capslock is ON !</div>
...
</body>
</html>

Вы можете использовать KeyboardEvent для обнаружения множества клавиш, включая блокировку заглавных букв в самых последних браузерах.

getModifierState функция предоставит состояние для:

  • Alt
  • AltGraph
  • CapsLock
  • Контроль
  • Fn (Android)
  • Мета
  • NumLock
  • ОС (Windows и Linux)
  • ScrollLock
  • Сдвиг

Эта демонстрация работает во всех основных браузерах, включая мобильные (могу ли я использовать).

passwordField.addEventListener( 'keydown', function( event ) {
  var caps = event.getModifierState && event.getModifierState( 'CapsLock' );
  console.info( caps ); // true when you press the keyboard CapsLock key
});

Я ответил на это на дублирующий / аналогичный вопрос, и другой пользователь сообщил, что теперь у него есть поддержка Chrome. Я подтвердил это, поэтому теперь работает во всех основных браузерах и должен быть лучшим решением этого вопроса.

Ian Clark 26.08.2016 10:49
caniuse.com/#search=getModifierState говорит, что в настоящее время он не поддерживается в Safari (пока?). Так что во всех основных браузерах это может быть не так.
Jens Kooij 12.09.2016 13:37

Теперь он поддерживается в Safari.

Mottie 31.03.2017 15:52

И все же он обнаруживает нажатие Capslock и не может получить общее состояние Capslock, когда пользователь вводит форму ...

SparK 07.11.2018 16:17

Кажется, это работает, кроме случаев, когда клавиша Caps Lock находится в положении выключенный. Он не принимает этот ввод до следующего нажатия клавиши. Это было в Chrome для OS X. Не уверен, что это работает в разных браузерах и ОС.

Ashraf Slamang 04.12.2018 10:59

@Mottie: не работает на реальном устройстве Android в мобильном браузере!

Aniruddha Shevle 15.03.2021 09:24

Вот настраиваемый плагин jquery, использующий jquery ui, состоящий из всех хороших идей на этой странице и использующий виджет всплывающей подсказки. Сообщение Caps Lock автоматически применяется ко всем полям с паролями и не требует изменений в вашем текущем HTML.

Пользовательский код плагина ...

(function ($) {
    $.fn.capsLockAlert = function () {
        return this.each(function () {
            var capsLockOn = false;
            var t = $(this);
            var updateStatus = function () {
                if (capsLockOn) {
                    t.tooltip('open');
                } else {
                    t.tooltip('close');
                }
            }
            t.tooltip({
                items: "input",
                position: { my: "left top", at: "left bottom+10" },
                open: function (event, ui) {
                    ui.tooltip.css({ "min-width": "100px", "white-space": "nowrap" }).addClass('ui-state-error');
                    if (!capsLockOn) t.tooltip('close');
                },
                content: function () {
                    return $('<p style = "white-space: nowrap;"/>')
                        .append($('<span class = "ui-icon ui-icon-alert" style = "display: inline-block; margin-right: 5px; vertical-align: text-top;" />'))
                        .append('Caps Lock On');
                }
            })
            .off("mouseover mouseout")
            .keydown(function (e) {
                if (e.keyCode !== 20) return;
                capsLockOn = !capsLockOn;
                updateStatus();
            })
            .keypress(function (e) {
                var kc = e.which; //get keycode

                var isUp = (kc >= 65 && kc <= 90) ? true : false; // uppercase
                var isLow = (kc >= 97 && kc <= 122) ? true : false; // lowercase
                if (!isUp && !isLow) return; //This isn't a character effected by caps lock

                // event.shiftKey does not seem to be normalized by jQuery(?) for IE8-
                var isShift = (e.shiftKey) ? e.shiftKey : ((kc === 16) ? true : false); // shift is pressed

                // uppercase w/out shift or lowercase with shift == caps lock
                if ((isUp && !isShift) || (isLow && isShift)) {
                    capsLockOn = true;
                } else {
                    capsLockOn = false;
                }
                updateStatus();
            });
        });
    };
})(jQuery);

Применить ко всем элементам пароля ...

$(function () {
    $(":password").capsLockAlert();
});

Есть гораздо более простое решение для обнаружения caps-lock:

function isCapsLockOn(event) {
    var s = String.fromCharCode(event.which);
    if (s.toUpperCase() === s && s.toLowerCase() !== s && !event.shiftKey) {
        return true;
    }
}

Код Javascript

<script type = "text/javascript">
   function isCapLockOn(e){
   kc = e.keyCode?e.keyCode:e.which;
   sk = e.shiftKey?e.shiftKey:((kc == 16)?true:false);
   if (((kc >= 65 && kc <= 90) && !sk)||((kc >= 97 && kc <= 122) && sk))
       document.getElementById('alert').style.visibility = 'visible';
   else
       document.getElementById('alert').style.visibility = 'hidden';
   }
</script>

Теперь нам нужно связать этот скрипт с помощью Html.

<input type = "password" name = "txtPassword" onkeypress = "isCapLockOn(event)" />
<div id = "alert" style = "visibility:hidden">Caps Lock is on.</div> 

Переменная, показывающая состояние Caps Lock:

let isCapsLockOn = false;

document.addEventListener( 'keydown', function( event ) {
  var caps = event.getModifierState && event.getModifierState( 'CapsLock' );
  if (isCapsLockOn !== caps) isCapsLockOn = caps;
});

document.addEventListener( 'keyup', function( event ) {
  var caps = event.getModifierState && event.getModifierState( 'CapsLock' );
  if (isCapsLockOn !== caps) isCapsLockOn = caps;
});

работает во всех браузерах => могу ли я использовать

Проголосовали за своевременный ответ на старый вопрос. Вы можете добавить что-то вроде заголовка вроде «Для современных браузеров (2017->) попробуйте это» или «Обновление для 2017 года».

eon 10.01.2018 00:43

Реагировать

onKeyPress(event) { 
        let self = this;
        self.setState({
            capsLock: isCapsLockOn(self, event)
        });
    }

    onKeyUp(event) { 
        let self = this;
        let key = event.key;
        if ( key === 'Shift') {
            self.shift = false;
        }
    }

    <div>
     <input name = {this.props.name} onKeyDown = {(e)=>this.onKeyPress(e)} onKeyUp = {(e)=>this.onKeyUp(e)} onChange = {this.props.onChange}/>
                {this.capsLockAlert()}
</div>

function isCapsLockOn(component, event) {
        let key = event.key;
        let keyCode = event.keyCode;

        component.lastKeyPressed = key;

        if ( key === 'Shift') {
            component.shift = true;
        } 

        if (key === 'CapsLock') {
            let newCapsLockState = !component.state.capsLock;
            component.caps = newCapsLockState;
            return newCapsLockState;
        } else {
            if ((component.lastKeyPressed !== 'Shift' && (key === key.toUpperCase() && (keyCode >= 65 && keyCode <= 90)) && !component.shift) || component.caps ) {
                component.caps = true;
                return true;
            } else {
                component.caps = false;
                return false;
            }
        }
    }

Mottie's и Диего Виейраотклик выше - это то, что мы в конечном итоге использовали, и теперь это должен быть принятый ответ. Однако, прежде чем я это заметил, я написал эту небольшую функцию javascript, которая не полагается на коды символов ...

var capsLockIsOnKeyDown = {shiftWasDownDuringLastChar: false,
  capsLockIsOnKeyDown: function(event) {
    var eventWasShiftKeyDown = event.which === 16;
    var capsLockIsOn = false;
    var shifton = false;
    if (event.shiftKey) {
        shifton = event.shiftKey;
    } else if (event.modifiers) {
        shifton = !!(event.modifiers & 4);
    }

    if (event.target.value.length > 0 && !eventWasShiftKeyDown) {
      var lastChar = event.target.value[event.target.value.length-1];
      var isAlpha = /^[a-zA-Z]/.test(lastChar);

      if (isAlpha) {
        if (lastChar.toUpperCase() === lastChar && lastChar.toLowerCase() !== lastChar
          && !event.shiftKey && !capsLockIsOnKeyDown.shiftWasDownDuringLastChar) {
          capsLockIsOn =  true;
        }
      }
    }
    capsLockIsOnKeyDown.shiftWasDownDuringLastChar = shifton;
    return capsLockIsOn;
  }
}

Затем вызовите его в обработчике событий, например, capsLockIsOnKeyDown.capsLockIsOnKeyDown(event)

Но опять же, мы закончили тем, что использовали ответы @Mottie s и @Diego Vieira.

Этот ответ на основе jQuery, опубликованный @ user110902, был мне полезен. Однако я немного улучшил его, чтобы предотвратить ошибку, упомянутую в комментарии @B_N: он не смог обнаружить CapsLock при нажатии Shift:

$('#example').keypress(function(e) { 
    var s = String.fromCharCode( e.which );
    if (( s.toUpperCase() === s && s.toLowerCase() !== s && !e.shiftKey )
    ||  ( s.toLowerCase() === s && s.toUpperCase() !== s && e.shiftKey )) {
        alert('caps is on');
    }
});

Таким образом, он будет работать даже при нажатии Shift.

уже поздно, я знаю, но это может быть полезно кому-то другому.

Итак, вот мое самое простое решение (с турецкими символами);

function (s,e)
{
    var key = e.htmlEvent.key;

    var upperCases = 'ABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZXWQ';
    var lowerCases = 'abcçdefgğhıijklmnoöprsştuüvyzxwq';
    var digits = '0123456789';

    if (upperCases.includes(key))
    {
        document.getElementById('spanLetterCase').innerText = '[A]';
    }

    else if (lowerCases.includes(key))
    {
        document.getElementById('spanLetterCase').innerText = '[a]';
    }

    else if (digits.includes(key))
    {
        document.getElementById('spanLetterCase').innerText = '[1]';
    }

    else
    {
        document.getElementById('spanLetterCase').innerText = '';
    }
}

Мы используем getModifierState для проверки Caps Lock, он является только членом события мыши или клавиатуры, поэтому мы не можем использовать onfocus. Наиболее распространенные два способа получения фокуса поля пароля - щелчок или вкладка. Мы используем onclick, чтобы проверить щелчок мышью внутри ввода, и мы используем onkeyup, чтобы обнаружить вкладку из предыдущего поля ввода. Если поле пароля является единственным полем на странице и автоматически сфокусировано, то событие не произойдет до тех пор, пока не будет отпущена первая клавиша, что нормально, но не идеально, вы действительно хотите, чтобы подсказки инструментов Caps Lock отображались, когда поле пароля становится сосредоточиться, но в большинстве случаев это решение работает как шарм.

HTML

<input type = "password" id = "password" onclick = "checkCapsLock(event)" onkeyup = "checkCapsLock(event)" />

JS

function checkCapsLock(e) {
  if (e.getModifierState("CapsLock")) {
    console.info("Caps");
  }
}

https://codepen.io/anon/pen/KxJwjq

Превосходно! Просто, лаконично и безупречно в моей реализации.

Sirtastic 20.09.2018 10:12

@Ryan: Спасибо за вклад! Это хороший чистый пример кода, хотя я хотел бы отметить, что ваш ответ в основном такой же, как Ответ Мотти из 2015 года, где вы оба используете event.getModifierState("CapsLock")..

Mac 20.09.2018 22:01

@Ryan: Не работает на реальном устройстве Android в мобильном браузере!

Aniruddha Shevle 15.03.2021 09:22

Итак, я нашел эту страницу, и решения, которые я нашел, мне не очень понравились, поэтому я придумал одно и предлагаю его всем вам. Для меня это имеет значение только в том случае, если включена фиксация заглавных букв, если я печатаю буквы. Этот код решил проблему для меня. Это быстро и легко, а также дает вам переменную capsIsOn, на которую можно ссылаться всякий раз, когда она вам нужна.

let capsIsOn=false;
let capsChecked=false;

let capsCheck=(e)=>{
    let letter=e.key;
    if (letter.length===1 && letter.match(/[A-Za-z]/)){
        if (letter!==letter.toLowerCase()){
          capsIsOn=true;
          console.info('caps is on');
        }else{
          console.info('caps is off');
        }
        capsChecked=true;
        window.removeEventListener("keyup",capsCheck);
    }else{
      console.info("not a letter, not capsCheck was performed");
    }

}

window.addEventListener("keyup",capsCheck);

window.addEventListener("keyup",(e)=>{
  if (capsChecked && e.keyCode===20){
    capsIsOn=!capsIsOn;
  }
});

Другие вопросы по теме