如何使用 JavaScript 判断是否打开了大写锁定?

How do you tell if caps lock is on using JavaScript?

提问人:nickf 提问时间:12/8/2008 最后编辑:Peter Mortensennickf 更新时间:1/16/2023 访问量:128442

问:

如何使用 JavaScript 判断是否打开了大写锁定?

不过有一点需要注意:我确实在谷歌上搜索了一下,我能找到的最佳解决方案是将事件附加到每个输入,然后每次检查按下的字母是否为大写,如果是,则检查是否也按住了shift。如果不是,则必须打开大写锁定。这感觉真的很脏,只是......浪费 - 肯定有比这更好的方法吗?onkeypress

JavaScript 键盘 大写锁定

评论

220赞 nickf 5/22/2009
因为我的太多用户像这样填写他们的表格。
7赞 some 9/29/2010
@nicf:如果这就是原因,为什么不在输入上运行正则表达式,并要求他们在大写字母太多时停止大喊大叫?
168赞 T Nguyen 6/11/2011
这样做有更好的理由。如果用户输入密码,如果他们的 capslock 打开,警告他们将非常有用。
27赞 nothingisnecessary 9/3/2014
似乎浏览器应该在用户输入字段时实现“大写锁定打开”警告(类似于 chrome 中的电子邮件地址验证等)input type=passwordinput type=email
8赞 Mac 4/7/2017
很好的问题,但公认的答案是 8 岁。更好的回应就在这里

答:

96赞 rajesh pillai 12/8/2008 #1

你可以试一试。.添加了一个工作示例。当焦点放在输入上时,打开大写锁定会使 LED 变为红色,否则为绿色。(尚未在 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 或 'ä', 'ö', 'ü'

上面的键只是示例表示。

评论

1赞 12/10/2009
它可能不是最好的实现,但当我写它时,我试图保持简单。我认为只有这样,你才能真正做到这一点,你需要为不同的浏览器覆盖令人讨厌的东西。
2赞 Tim 3/26/2014
我发现将其与 keydown 一起使用(在 chrome 中)会导致所有代码都作为大写字母。如果我使用按键,它可以工作。
2赞 awe 6/11/2015
为所有国际字符找到每个可能的字符组合注定会错过一些情况。请改用 toUpper/Lower 方法检查大小写。
4赞 GameAlchemist 11/4/2015
假设答案完全错误 - 令人困惑的字符代码和 ascii (!!)- 可以得到那么多的赞成票。从来没有人检查过???
1赞 verism 2/18/2016
请注意,根据 Mozilla 的说法,event.which 已从 Web 标准中删除。
24赞 Borgar 12/9/2008 #2

您可以使用文档上的按键捕获使用“is letter uppercase and no shift pressed”来检测大写锁定。但是,您最好确保没有其他按键处理程序在事件气泡到达文档上的处理程序之前弹出事件气泡。

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')
  }
}

您可以在支持该事件的浏览器中捕获事件,但这似乎毫无意义,因为它不适用于所有浏览器。

我想不出任何其他方法来实际检测大写锁定状态。无论如何,检查很简单,如果输入了不可检测的字符,那么......那么检测就没有必要了。

去年有一篇关于 24 种方法的文章。相当不错,但缺乏国际角色支持(用来解决这个问题)。toUpperCase()

评论

0赞 Mladen Janjetovic 12/26/2013
这实际上是我一直在寻找的。这适用于拉丁文和西里尔文字符串。谢谢!
0赞 1/16/2014
这很好用,但像空格和数字这样的键会提示警告。知道一个(同样简洁/优雅的)解决方法吗?
1赞 1/16/2014
另外,你注意到不完整是件好事,但它仍然是不完整的。不知道如何使用此方法解决此问题。
0赞 Aniruddha Shevle 3/22/2021
@Bordar:在移动浏览器上的实际安卓设备上不起作用!
129赞 user110902 5/22/2009 #3

在jQuery中,

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

避免错误,例如需要退格键。s.toLowerCase() !== s

评论

5赞 Shea 11/8/2011
实际上。。。fromCharCode 消除了我甚至检查的需要。但是应该注意的是,keydown 和 keypress 给出了不同的字符代码,这是我首先出错的地方。
5赞 1/16/2014
-1 bc 这仅在他们在 CAPS 打开时未按下 shift 时才有效。
1赞 Govinda Rajbhar 1/22/2016
如果有人想查看带有 bootstrap 的实时示例,您可以在此处查看 bootply.com/91792
0赞 SebasSBM 7/17/2018
这个答案对我有用。由于 @D_N 提到的缺陷,我改进了这个答案中的条件,即它在按 shift 时不起作用。
0赞 TAHA SULTAN TEMURI 1/21/2021
但是,如果它仅在文档加载时打开怎么办?
12赞 Joe Liversedge 9/29/2010 #4

在 JQuery 中。这涵盖了 Firefox 中的事件处理,并将检查意外的大写和小写字符。这预先假设了一个元素和一个 id 为 '' 的单独元素,该元素具有我们想要显示的警告(但否则被隐藏)。<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();
    }
});

评论

0赞 1/15/2014
我不知道为什么,但这种方法在第一次按键时不起作用(仅在 Chrome 上测试)。
0赞 1/16/2014
会不会是空字段隐藏问题?我无法让它正常工作,至少在 Chrome 中是这样。它会自动发生在许多其他浏览器中(至少在我的版本中,如下),因为退格键计数并清空了 mssg。
0赞 KyleMit 2/21/2018
注意:正如您在此处正确使用的那样,您需要使用该事件在输入上使用不同的大小写,因为 keydownkeyup 都将始终返回大写。因此,这不会触发 capslock 键......如果您打算与keypresse.originalEvent.getModifierState('CapsLock')
0赞 Naga Harish M 12/2/2010 #5

在下面的代码中,当 Caps 锁定并使用 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;
    }
});

评论

0赞 awe 2/10/2014
仅当大写锁定打开时才有效。如果 caps lock 已关闭,它仍会报告 caps lock 已打开,但按下了 shift 键(实际按下或未按下 shift 键)。
0赞 Naga Harish M 2/10/2014
好的,对不起,@awe
5赞 Zappa 11/22/2011 #6

我知道这是一个古老的话题,但我想我会反馈,以防它对其他人有所帮助。这个问题的答案似乎都不适用于 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> 

评论

0赞 1/16/2014
感谢您的 IE8 修复。将其纳入我重新设计的答案(如下)。不过,这是可靠的。
-1赞 Frederik.L 12/19/2011 #7

键入时,如果打开了 caplock,它可以自动将当前字符转换为小写。这样,即使打开了 caplocks,它也不会像在当前页面上那样运行。为了通知您的用户,您可以显示一个文本,说明caplocks已打开,但表单条目已转换。

评论

0赞 Dave Liepmann 4/20/2012
是的,但是您仍然需要检测大写锁定。此外,这意味着您不允许在密码中使用大写字母,这是次优的。
0赞 Frederik.L 10/23/2012
要检测 caps lock 是否打开,您必须检查您发送的 char 的小写版本是否与它不同,如果是 --> caps lock,那么“警告:您正在使用 caps lock,但我们的系统正在以小写形式转换”,我想 javascript 毕竟不是用来检测大写锁定的(检查大写锁定需要系统访问), 您必须找到最适合您需求的方法
0赞 sourabh kasliwal 11/5/2012 #8

试试这个简单易懂的简单代码

这是脚本

 <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> 
3赞 Pavel Azanov 1/2/2013 #9

最近在 hashcode.com 上有一个类似的问题,我创建了一个jQuery插件来处理它。它还支持识别大写字母锁定数字。(在标准的德语键盘布局上,大写锁定对数字有影响)。

您可以在此处查看最新版本:jquery.capsChecker

13赞 joshuahedlund 9/20/2013 #10

许多现有答案会在未按下 shift 时检查大写锁定,但如果您按下 shift 并获得小写字母,则不会检查它,或者会检查但不会检查大写锁定是否关闭,或者会检查但会将非 alpha 键视为“关闭”。这是一个经过改编的 jQuery 解决方案,如果按下带有大写字母(shift 或无 shift)的 alpha 键,它将显示警告,如果按下不带大写的 alpha 键,它将关闭警告,但在按下数字或其他键时不会关闭或打开警告。

$("#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)
  });
6赞 user241244 1/16/2014 #11

由于几个原因,这里的主要答案对我不起作用(带有死链接和不完整解决方案的未注释代码)。因此,我花了几个小时尝试每个人,并尽我所能:这是我的,包括 jQuery 和非 jQuery。

j查询

请注意,jQuery 会规范化事件对象,因此缺少一些检查。我还将其缩小到所有密码字段(因为这是需要它的最大原因)并添加了一条警告消息。这已经在 Chrome、Mozilla、Opera 和 IE6-8 中进行了测试。稳定并捕获所有大写锁定状态,除非按下数字或空格。

/* 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 开发的插件,我没有尝试过,但是个好主意。如果有人知道将范围扩展到 A-Za-z 之外的方法,请编辑。此外,这个问题的 jQuery 版本作为重复项关闭,所以这就是我在这里发布这两个版本的原因。

评论

5赞 awe 2/10/2014
一个好的解决方案应该始终包括对英文字母 A-Z 之外的字母的支持。任何其他解决方案都是对几乎所有非英语语言的侮辱。
0赞 Aniruddha Shevle 3/22/2021
不适用于移动浏览器上的实际安卓设备!
2赞 formixian 1/23/2014 #12

此代码检测大写锁定,无论情况如何或是否按下 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');
    }
});

评论

0赞 Adrian Rosca 10/17/2014
这会导致空格和退格键在 Firefox 上检测为大写。
5赞 awe 2/10/2014 #13

这是一种解决方案,除了在写入时检查状态外,还会在每次按下键时切换警告消息(有一些限制)。Caps Lock

它还支持 AZ 范围之外的非英语字母,因为它会根据字符串字符而不是字符范围进行检查。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 锁定状态通过 password 元素上的 JavaScript 属性进行保留。这是在用户按下大写或小写的字母时首次验证大写锁定状态时设置的。如果窗口失去焦点,我们将无法再观察到大写锁定切换,因此我们需要重置为未知状态。Caps Lockcaps

评论

2赞 Ajedi32 6/10/2015
好主意。如果要向用户显示大写锁定已打开的警告,则最好在禁用大写锁定时立即关闭该警告,否则可能会使用户感到困惑。
0赞 Oday Fraiwan 6/2/2014 #14

尝试使用此代码。

$('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
});

祝你好运:)

2赞 Aadit M Shah 6/4/2014 #15

我写了一个名为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 键 hack 来确定 Caps Lock 键的正确状态。最初状态为 。所以要小心。false

评论

0赞 Ric 8/12/2014
这是一个非常巧妙的解决方案。但它有一个错误,即如果当页面获得焦点时 Caps Lock 处于打开状态,则“capslock”对象以不正确的状态(关闭)开始。
0赞 Aadit M Shah 8/12/2014
事实上,它始于一个不正确的状态。但是,当您按下任何键时,它会自动更正其状态。如果你能找到一种方法,在页面获得焦点时将其设置为正确的状态,那么我将非常乐意合并你的代码。
2赞 enigment 7/16/2014 #16

另一个版本,清晰而简单,处理移位的大写字母Lock,并且不限于我认为的 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];

编辑:大写锁定的感觉被颠倒了,哎呀,固定了。

编辑#2:在进一步检查之后,我做了一些更改,不幸的是,代码更详细一些,但它适当地处理了更多操作。

  • 使用 e.charCode 而不是 e.keyCode 并检查 0 值会跳过许多非字符按键操作,而无需对特定于给定语言或字符集的任何内容进行编码。根据我的理解,它的兼容性稍差,因此较旧的、非主流的或移动浏览器的行为可能不符合此代码的预期,但无论如何,就我的情况而言,这是值得的。

  • 根据已知标点符号代码列表进行检查可防止它们被视为漏报,因为它们不受大写锁定的影响。否则,当您键入任何标点符号时,大写锁定指示器将被隐藏。通过指定排除的集合(而不是包含的集合),它应该与扩展字符更兼容。这是最丑陋、最特别的一点,非西方语言有足够多的标点符号和/或标点符号代码可能会成为问题,但至少就我的情况而言,这同样是值得的 IMO。

3赞 ramiz4 9/8/2014 #17

对于带有 twitter 引导程序的 jQuery

检查锁定的以下字符的大小写:

大写 A-Z 或 'Ä', 'Ö', 'Ü', '!', '“', '§', '$', '%', '&', '/', '(', ')', '=', ':', ';', '*', '''

小写 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 上的现场演示

评论

0赞 Aniruddha Shevle 3/22/2021
不适用于移动浏览器上的实际安卓设备!
1赞 Cedric Simon 2/16/2015 #18

基于@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>
136赞 Mottie 12/15/2015 #19

您可以使用 来检测许多键,包括最新浏览器上的大写锁定。KeyboardEvent

getModifierState 函数将提供以下状态:

  • Alt
  • AltGraph (替代图形)
  • 大写锁定
  • 控制
  • Fn (安卓)
  • 数字锁
  • 操作系统(Windows 和 Linux)
  • 滚动锁定
  • 转变

此演示适用于所有主要浏览器,包括移动浏览器(caniuse)。

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

评论

10赞 Ian Clark 8/26/2016
我在一个欺骗/类似的问题上回答了这个问题,并被另一位用户更新说这现在有 Chrome 支持。我确认了这一点,所以现在适用于所有主要浏览器 - 应该是这个问题的最佳解决方案
3赞 Mottie 3/31/2017
它现在在 Safari 中受支持。
4赞 SparK 11/7/2018
然而,当用户输入表单时,它会检测到 capslock 按下并且无法获得一般的 capslock 状态......
3赞 Ashraf Slamang 12/4/2018
这似乎有效,除非将大写锁定键按到关闭位置。直到下一次按键时,它才会拾取该输入。这是在 Chrome for OS X 上。不确定这是否是跨浏览器和操作系统的东西。
1赞 Aniruddha Shevle 3/15/2021
@Mottie:在移动浏览器上的实际安卓设备上不起作用!
0赞 Ben Gripka 1/9/2016 #20

这是一个自定义的jquery插件,使用jquery ui,由此页面上的所有好主意组成,并利用了工具提示小部件。大写锁定消息会自动应用于所有密码框,并且不需要更改您当前的 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();
});
-1赞 ron tornambe 6/23/2016 #21

有一个更简单的解决方案来检测 caps-lock:

function isCapsLockOn(event) {
    var s = String.fromCharCode(event.which);
    if (s.toUpperCase() === s && s.toLowerCase() !== s && !event.shiftKey) {
        return true;
    }
}
0赞 M Arfan 7/27/2016 #22

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> 
3赞 Alice Rocheman 7/19/2017 #23

显示大写锁定状态的变量:

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;
});

适用于所有浏览器 => canIUse

评论

1赞 eon 1/10/2018
对一个老问题给出最新答案投了赞成票。您可能希望添加类似标题的内容,例如“对于现代浏览器(2017->)试试这个”或“2017 年更新”
2赞 José Araújo 9/2/2017 #24

反应

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;
            }
        }
    }
1赞 Chris 3/22/2018 #25

上面 MottieDiego Vieira回答是我们最终使用的,现在应该是公认的答案。然而,在我注意到它之前,我写了这个不依赖字符代码的小 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和@Diego维埃拉的回应

3赞 SebasSBM 7/17/2018 #26

@user110902发布的这个基于jQuery的答案对我很有用。但是,我对其进行了一点改进,以防止@B_N的评论中提到的缺陷:当您按 Shift 时,它无法检测到 CapsLock:

$('#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 键也可以工作。

0赞 nadir 7/27/2018 #27

我知道已经晚了,但是,这可能会对其他人有所帮助。

所以这是我最简单的解决方案(使用土耳其字符);

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 = '';
    }
}
6赞 Ryan Marin 9/20/2018 #28

我们用来检查大写锁定,它只是鼠标或键盘事件的成员,因此我们不能使用 .密码字段获得焦点的最常见两种方式是单击或选项卡。我们用于检查输入中的鼠标单击,并用于检测上一个输入字段中的选项卡。如果密码字段是页面上的唯一字段并且是自动聚焦的,那么在释放第一个键之前不会发生该事件,这很好,但并不理想,您真的希望在密码字段获得焦点后显示大写锁定工具提示,但在大多数情况下,此解决方案就像一个魅力。getModifierStateonfocusonclickonkeyup

[HTML全

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

JS公司

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

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

评论

0赞 Cameron C 9/20/2018
高超!在我的实现中简单、简洁、完美无瑕。
1赞 Mac 9/21/2018
@Ryan:谢谢你的贡献!这是一个很好的、干净的代码示例,尽管我想指出你的回答与 Mottie 在 2015 年的回复基本相同,你们俩都在那里使用event.getModifierState("CapsLock").
0赞 Aniruddha Shevle 3/15/2021
@Ryan:在移动浏览器上的实际Android设备上不起作用!
0赞 Mike Sraj 10/12/2018 #29

所以我找到了这个页面,但不太喜欢我找到的解决方案,所以我想出了一个,并把它提供给你们所有人。对我来说,只有当我输入字母时,大写锁定是否打开才重要。这段代码为我解决了这个问题。它既快速又简单,并为您提供一个 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.log('caps is on');
        }else{
          console.log('caps is off');
        }
        capsChecked=true;
        window.removeEventListener("keyup",capsCheck);
    }else{
      console.log("not a letter, not capsCheck was performed");
    }

}

window.addEventListener("keyup",capsCheck);

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

1赞 Alireza 11/18/2021 #30

如何使用 getModifierState()

getModifierState() 方法返回 true,如果指定的修饰符 键已按下或激活。

您可以像以下方式使用它:

function checkIfCapsLockIsOn(event) {
  var capsLockIsOn = event.getModifierState("CapsLock");
  console.log("Caps Lock activated: " + capsLockIsOn);
}

这将简单地检查 CapsLock 是打开还是关闭并在控制台中显示它。您可以更改所需的函数工作方式。

然后,例如在键扣键控上使用此功能。

<input type="text" onkeydown="checkIfCapsLockIsOn(event)">