【问题标题】:How to write a good Caps Lock detection solution in JavaScript?如何在 JavaScript 中编写一个好的 Caps Lock 检测解决方案?
【发布时间】:2015-10-26 15:01:23
【问题描述】:

找到了这个 Caps Lock 检测解决方案。在这里提琴:https://jsfiddle.net/07ugkacn/11/(谢谢 Armfoot)。 JS/jQuery 代码在这里:

$(function () {
    var isShiftPressed = false;
    var isCapsOn = null;
    $("#txtName").bind("keydown", function (e) {
        var keyCode = e.keyCode ? e.keyCode : e.which;
        if (keyCode == 16) {
            isShiftPressed = true;
        }
    });
    $("#txtName").bind("keyup", function (e) {
        var keyCode = e.keyCode ? e.keyCode : e.which;
        if (keyCode == 16) {
            isShiftPressed = false;
        }
        if (keyCode == 20) {
            if (isCapsOn == true) {
                isCapsOn = false;
                $("#error").hide();
            } else if (isCapsOn == false) {
                isCapsOn = true;
                $("#error").show();
            }
        }
    });
    $("#txtName").bind("keypress", function (e) {
        var keyCode = e.keyCode ? e.keyCode : e.which;
        if (keyCode >= 65 && keyCode <= 90 && !isShiftPressed) {
            isCapsOn = true;
            $("#error").show();
        } else {
            $("#error").hide();
        }
    });
});

非常适合我的需求。我正在尝试用 JavaScript 重写它,没有 jQuery。如何在没有 jQuery 的情况下重写绑定方法?我尝试将输入字段存储在变量中并写入

passwordInput.onkeyup = function(e) { ... } 

...例如。但无济于事。认为这是阻止此解决方案工作的原因。

请帮忙。

【问题讨论】:

  • 为什么不检查两个接一个写的字母是否大写?另外,当你不喜欢这个解决方案时,找出哪个键码 capslock 并检查它是否打开
  • 这不是最优的。用户需要知道大写锁定是在点击输入时打开的,而不是在他们开始输入之后。问题是在用户关闭大写锁定后会显示大写锁定消息,并且仅在用户输入至少一个字符后才会隐藏。这远非理想。我控制 C'eed 和 V'eed 的解决方案非常适合我的需求。我只需要在没有 JQuery 的纯 JavaScript 中使用它。
  • 我的同事不希望我在项目中使用 jQuery 来最小化在此特定页面加载时加载的脚本。所以,是的,这就是我想要的。要翻译这个。很多对我来说似乎相当明显,如果没有 jQuery 将如何重写。我认为问题在于绑定函数。如果您能告诉我如何重新编写上述绑定函数,您将赢得今天的互联网。
  • 脚本也只检查写的第一个字母是否是大写并按下 shift .. 如果不是 CAPS 开启 ;) 你可以将它与我上面提到的其他 2 个条件结合起来,你可以这样做你自己的
  • 如果您显示您尝试过的代码,它会更容易为您提供帮助。为 onkeypress 分配一个函数是这样做的方法,所以如果你想知道为什么它不适合你,你必须展示更多的代码。

标签: javascript jquery rewrite


【解决方案1】:

编辑:我自己想出来的

它可能关心的人,在 vanilla JavaScript 中进行大写检测的解决方案。互联网上流传的大多数解决方案的问题是,它们仅在用户开始在输入字段中输入时显示/隐藏警报/弹出窗口。这不是最佳选择,因为在用户关闭 Caps Lock 后“Caps Lock 已打开”通知仍然可见,并且在他们继续键入之前一直如此。这又长又笨,我自己还是不太明白。但我还是推荐它。

function capsDetect() {
  var body = document.getElementsByTagName('body')[0];
  var isShiftPressed = false;
  var isCapsOn = null;
  var capsWarning = document.getElementById('caps-lock-warning');
  body.addEventListener('keydown', function(e) {
  var keyCode = e.keyCode ? e.keyCode : e.which;
  if (keyCode = 16){
   isShiftPressed = true;
}
});
body.addEventListener('keyup', function(e) {
 var keyCode = e.keyCode ? e.keyCode : e.which;
 if(keyCode == 16) {
   isShiftPressed = false;
}
 if(keyCode == 20) {
  if(isCapsOn == true) {
   isCapsOn = false;
   capsWarning.style.visibility = 'hidden';
} else if (isCapsOn == false) {
  isCapsOn = true;
  capsWarning.style.visibility = 'visible';
}
}
});
body.addEventListener('keypress', function(e) {
  var keyCode = e.keyCode ? e.keyCode : e.which;
  if(keyCode >= 65 && keyCode <= 90 && !isShiftPressed) {
    isCapsOn = true;
    capsWarning.style.visibility = 'visible';
} else {
    capsWarning.style.visibility = 'hidden';
}
});
}
shiftCaps();

【讨论】:

    【解决方案2】:

    Gaweyne, nicely done!我测试了你的纯 JS 代码,我修改了一些你可能会感兴趣的东西:

    • 输入时忽略控制字符 (
    • 以同样的方式将if (keyCode = 16){替换为if (keyCode === 16){和其他==
    • 使用display 属性而不是visibility (CSS);
    • 始终将 isCapsOn 视为布尔值;
    • 调用capsDetected 而不是shiftCaps

    你可以运行下面的sn-p来查看:

    function capsDetect() {
      var body = document.getElementsByTagName('body')[0];
      var isShiftPressed = false;
      var isCapsOn = false;
      var capsWarning = document.getElementById('error');
      body.addEventListener('keydown', function(e) {
        var keyCode = e.keyCode ? e.keyCode : e.which;
        if (keyCode === 16) {
          isShiftPressed = true;
        }
      });
      body.addEventListener('keyup', function(e) {
        var keyCode = e.keyCode ? e.keyCode : e.which;
        if (keyCode === 16) {
          isShiftPressed = false;
        }
        if (keyCode === 20) {
          if (isCapsOn) {
            isCapsOn = false;
            capsWarning.style.display = 'none';
          } else {
            isCapsOn = true;
            capsWarning.style.display = 'inline-block';
          }
        }
      });
      body.addEventListener('keypress', function(e) {
        var keyCode = e.keyCode ? e.keyCode : e.which;
        if (keyCode <= 40)
          return;
        if (keyCode >= 65 && keyCode <= 90 && !isShiftPressed) {
          isCapsOn = true;
          capsWarning.style.display = 'inline-block';
        } else {
          capsWarning.style.display = 'none';
        }
      });
    }
    capsDetect();
    body {
      font-family: Arial;
      font-size: 10pt;
    }
    #error {
      border: 1px solid #FFFF66;
      background-color: #FFFFCC;
      display: inline-block;
      margin-left: 10px;
      padding: 3px;
      display: none;
    }
    <form action="">
      <input id="txtName" type="text" /><span id="error">Caps Lock is ON.</span>
    </form>

    也许更多的调整会使其变得完美......页面加载时仍然存在CAPS LOCK检测:也许通过在后台模拟用户输入会让我们知道,但现在我还没有完全弄清楚呢.

    顺便说一句,我以前从未想过这样做,但很明显它可以帮助用户,特别是在密码字段中。事实上,我可能会亲自使用它!所以我真的很感谢你花时间发布这个:)

    【讨论】:

    • 嘿,感谢您的改进! :D 当我想在其他地方做另一个 Caps Lock 通知时,我会把它保存在某个地方。老实说并在博客上修改我喜欢的解决方案真是太幸运了。现在我有一天的时间来考虑它,尽管我理解我建议其他人做的事情 O_o
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 2012-02-22
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 2012-10-07
    相关资源
    最近更新 更多