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

IT技术 javascript keyboard capslock
2021-01-23 23:34:33

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

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

6个回答

在 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需要退格键

-1 bc 这仅适用于在 CAPS 开启时他们没有按下 shift 键的情况。
2021-03-15 23:34:33
这个答案对我很有用。由于@D_N 提到的缺陷,我改进了这个答案中的条件,它在按 shift 时不起作用。
2021-03-15 23:34:33
实际上...... fromCharCode 消除了我什至检查的需要。但是应该注意的是 keydown 和 keypress 给出了不同的字符代码,这是我首先出错的地方。
2021-03-20 23:34:33
但是如果它只在文档加载时打开呢?
2021-03-24 23:34:33
如果有人想看到引导程序的现场示例,您可以在此处查看bootply.com/91792
2021-04-01 23:34:33

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

getModifierState函数将为以下各项提供状态:

  • Alt
  • 替代图
  • 大写锁定
  • 控制
  • 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
});
我在一个dupe/similar question上回答了这个问题,另一个用户更新了它现在支持Chrome。我确认了这一点,所以现在适用于所有主要浏览器 - 应该是这个问题的最佳解决方案
2021-03-21 23:34:33
caniuse.com/#search=getModifierState说它目前在 Safari 上不受支持(还?)。所以在所有主要浏览器中可能还不是这样。
2021-03-31 23:34:33
现在 Safari 支持它。
2021-03-31 23:34:33
然而它检测到大写锁定按下并且当用户输入表单时无法获得一般的大写锁定状态......
2021-04-06 23:34:33
这似乎有效,除非将大写锁定键按到关闭位置。直到下一次按下按键时,它才会接收该输入。这是在 OS X 的 Chrome 上。不确定这是否跨浏览器和操作系统。
2021-04-09 23:34:33

你可以试一试..添加了一个工作示例。当焦点在输入上时,打开大写锁定会使 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;
}

对于国际字符,可以根据需要对以下键添加额外的检查。您必须获得您感兴趣的字符的键码范围,可能是通过使用键映射数组来保存您正在寻址的所有有效用例键...

大写 AZ 或“Ä”、“Ö”、“Ü”、小写 aZ 或 0-9 或“ä”、“ö”、“ü”

上述键只是示例表示。

为所有国际字符查找每种可能的字符组合注定会错过某些情况。改用 toUpper/Lower case 方法来检查大小写。
2021-03-11 23:34:33
请注意,根据 Mozilla, event.which 已从 Web 标准中删除。
2021-03-20 23:34:33
我发现将它与 keydown(在 chrome 中)一起使用会导致所有代码都被选择为大写。如果我使用按键它可以工作。
2021-04-02 23:34:33
令人惊讶的是,一个完全错误的答案 - 混淆了字符代码和 ascii (!!!) - 可以获得那么多的支持。没有人查过???
2021-04-02 23:34:33
这可能不是最好的实现,但是当我编写它时,我试图保持简单。我认为,您可以真正做到这一点的唯一方法是为不同的浏览器提供所需的麻烦。
2021-04-06 23:34:33

您可以使用文档上的按键捕获使用“是字母大写且未按下移位”来检测大写锁定。但是你最好确保在事件气泡到达文档上的处理程序之前没有其他按键处理程序弹出事件气泡。

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()用来解决这个问题)。

@Bordar:在移动浏览器上的实际 android 设备上不起作用!
2021-03-12 23:34:33
这实际上是我正在寻找的。这适用于拉丁文和西里尔文字符串。谢谢!
2021-03-22 23:34:33
这很有效,但空格和数字等键会提示警告。知道一个(同样简洁/优雅)的解决方法吗?
2021-03-25 23:34:33
此外,您注意到不完整是件好事,但它仍然是不完整的。不知道如何用这种方法解决这个问题。
2021-03-31 23:34:33

许多现有的答案会在没有按下 shift 时检查大写锁定,但如果你按下 shift 并得到小写,则不会检查它,或者会检查它但也不会检查大写锁定是否关闭,或者会检查,但是会将非 alpha 键视为“关闭”。这是一个经过调整的 jQuery 解决方案,如果按大写字母键(移位或不移位),将显示警告,如果按不带大写字母的 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)
  });