如何使用 JavaScript 在页面加载时(即,不在按键时)检测 Caps Lock 状态?

Posted

技术标签:

【中文标题】如何使用 JavaScript 在页面加载时(即,不在按键时)检测 Caps Lock 状态?【英文标题】:How to detect Caps Lock state on page load (that is, not on keypress) with JavaScript? 【发布时间】:2015-10-25 20:15:48 【问题描述】:

所以我一直在研究使用 javascript/jQuery 对表单进行 Caps Lock 检测的解决方案。 *** 上有一个巨大的线程,提供了许多解决方案。但唯一的问题是他们不检查 Caps Lock 本身是否被直接按下。它们检测是否输入了大写字母以及是否没有按下 shift 键。这样做的缺点是,在用户开始输入表单之前,我的 Caps Lock 警告消息不会打开/关闭,这几乎不是最佳选择。这是我的代码。

document.onkeypress = function(e)
    e = e || window.event;
    var s = String.fromCharCode(e.keyCode || e.which);
    if (s.toUpperCase() === s && !e shiftKey) 
        capsWarning.style.visibility = 'visible';
     else 
        capsWarning.style.visibility = 'hidden';
    

有没有更好的方法,当我按下 Caps Lock 键时,我可以使用 JavaScript 触发大写锁定消息?也就是说,在我开始输入之前不要延迟切换消息?

比起 JQuery,我更喜欢纯 JavaScript 解决方案。虽然如果你认为 jQuery 会非常非常好,请说出原因,我可以向我的同事施压,让我将它包含在此处;o

【问题讨论】:

有些场景没有涵盖:如果大写锁定在页面加载之前处于活动状态怎么办? AFAIK 在按下键之前无法获取键盘状态。 我的意思是,我希望 JavaScript 在我开始在输入字段中输入密码之前检测 Caps Lock 是否打开。所以是的,必须按下一个键。现在,用户只有在他/她开始输入登录详细信息后才会知道 Caps Lock 是否打开。这不是最优的。很抱歉造成混乱。 现代浏览器在事件对象中有getModifierState()方法。如果您不必支持较旧的浏览器,则可以使用它。虽然这也需要一个事件,但你可以通过自己触发一个事件来实现它? 您能否举一个更详细的使用 getModifierState() Teemu 的例子? @Gaweyne Here's a fiddle。不幸的是,似乎只有 MouseEvents 和 KeyboardEvents 有 getModifierState 方法。你的任务的一个好的事件是onfocus,但它的事件对象没有上述方法。此外,如果您通过 JS 触发 keydown 方法,您将始终从 getModifierState() 获得false(请参阅链接小提琴的第一个版本)。 【参考方案1】:

我在 chrome 中测试了它,它工作正常,把这个 JavaScript 放在标签中

function  loadcaps ( e ) 
     e = e || window.event;
     var s = String.fromCharCode( e.keyCode || e.which );
     if ( s.toUpperCase() === s && !e.shiftKey )             
          capsWarning.style.visibility = 'visible';
      else 
          capsWarning.style.visibility = 'hidden';
     
  

并把它放在你的标签上

<body onload="loadcaps()">

让我知道它是否适合你。

【讨论】:

【参考方案2】:

使用下面提到的代码:

<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('divon').style.visibility = 'visible';
       document.getElementById('divoff').style.visibility = 'hidden';
     else
      document.getElementById('divon').style.visibility = 'hidden';
       document.getElementById('divoff').style.visibility = 'visible';
    
    
    </script>
    <input type="text" name="trackcaps" onkeypress="capLock(event)" />
    <div id="divon" style="visibility:hidden">Caps Lock is on.</div>`enter code here`
    <div id="divoff" style="visibility:hidden">Caps Lock is off.</div>

【讨论】:

【参考方案3】:

我已经使用了这段代码并尝试调度一个事件。 getModifierState MSDN, MDN 除了 false 之外不会返回。实际上,您将按原样发送一个字符-“a”或“A”。无论哪种情况,它都会被硬编码。

getModifierState 仅在真正按键的情况下才会返回 true。

但是在 IE 11 中有一个自动 CapsLock 检测(对于&lt;input type="password" /&gt;

            var eventType = "keypress";
            window.addEventListener ( eventType, function(e)
                var msg = "Key Pressed: " + String.fromCharCode(e.charCode) + "\n" + "charCode: " + e.charCode + "\n" + e.getModifierState ( "CapsLock" );
                console.log ( msg );
            , false );

            function simulateKeyEvent() 
                var evt = document.createEvent("KeyboardEvent");
                var initMethod = typeof evt.initKeyboardEvent !== 'undefined' ? "initKeyboardEvent" : "initKeyEvent";

                evt[initMethod](
                    "keypress",         // type,
                    true,               // bubbles,
                    true,               // cancelable,
                    window,             // viewArg, 
                    0,                  // ctrlKeyArg,
                    0,                  // altKeyArg,
                    0,                  // shiftKeyArg,
                    0,                  // metaKeyArg, 
                    /* lower a */ 97,   //  keyCodeArg,
                    /* lower a */ 97    //  charCodeArg
                );
                window.dispatchEvent(evt);
            
            simulateKeyEvent();

【讨论】:

【参考方案4】:

使用onkeydown 处理程序:

document.onkeypress=function()console.log(arguments);

【讨论】:

请重新阅读问题。它询问如何在不等待按键的情况下进行操作。 我用 onkeydown 替换了 onkeypress。当我在输入任何内容之前按下大写键时,会出现我的大写锁定消息。但是当我再次按下大写,将其关闭时,消息仍然存在;o @Quentin 那是不可能的。我正在解决这部分问题:Is there a better way, that I can trigger a caps lock message, with JavaScript when I press the Caps Lock key? lel。实际上,现在无论我按什么键都会显示大写锁定消息:s @昆汀。没有肯尼是对的。至少必须按下 Caps Lock。我想知道 JavaScript 是否可以检测到,而无需在输入字段中输入。 “有没有更好的方法,我可以在按下 Caps Lock 键时使用 JavaScript 触发大写锁定消息?也就是说,不要延迟切换消息,直到我开始输入 [即,例如输入密码]”不清楚。

以上是关于如何使用 JavaScript 在页面加载时(即,不在按键时)检测 Caps Lock 状态?的主要内容,如果未能解决你的问题,请参考以下文章

当页面在没有 javascript 支持的情况下加载时,如何将光标(自动聚焦)放置在文本框中?

如何仅在页面加载的 10% 时执行 JavaScript

如何防止在页面加载时执行 javascript 函数?

如何在加载我的 html 页面时调用 JavaScript 函数? [复制]

当用户到达页面末尾以加载新内容时,如何调用 JavaScript (AJAX) 函数?

在页面加载时自动运行javascript代码[重复]