【问题标题】:Restricting keyboard input with keypress jQuery使用按键 jQuery 限制键盘输入
【发布时间】:2016-05-29 22:55:40
【问题描述】:

我有一个我用游戏创建的按键功能,以使用 enter 按钮以表单形式获取用户输入(并让我定义的一系列功能首先在 上按顺序执行Enter 键被按下)。

$(".form-control").keypress(function(event) {
          var keycode = (event.keyCode ? event.keyCode : event.which);
          if (keycode == 13) {
            var space = $(this).val().toLowerCase();

            if (!(wrongGuesses.indexOf(space) > -1 || rightGuesses.indexOf(space) > -1)) {
              play(space);
              $(this).val('');
              endGame();
              return false;
            }
            else
              window.alert("You already guessed this letter.");

            }
  }); 

效果很好。但是,现在,我试图限制用户只能输入字母并且一次只能输入一个字母 - 我想先限制输入单个字母以外的任何内容,然后保持我的按键事件链绑定之后进入回车键-我尝试过这样做:

 $(".form-control").keypress(function(event) {
          var keycode = (event.keyCode ? event.keyCode : event.which);
          if (!(keycode >= 65 && keycode <= 90)){
             event.preventDefault();
          }   
          if (keycode == 13) {
      //    if (keycode > 65 && keycode < 90){
            var space = $(this).val().toLowerCase();

            if (!(wrongGuesses.indexOf(space) > -1 || rightGuesses.indexOf(space) > -1)) {
              play(space);
              $(this).val('');
              endGame();
              return false;
            }
            else
              window.alert("You already guessed this letter.");

            }
         //   }
  });

这不起作用(我觉得语法是错误的)并且它弄乱了我的游戏功能; 然后我尝试了:

$(".form-control").keypress(function(event) {
          var keycode = (event.keyCode ? event.keyCode : event.which);

          if (keycode == 13) {
            var space = $(this).val().toLowerCase();

            if (!(wrongGuesses.indexOf(space) > -1 || rightGuesses.indexOf(space) > -1)) {
              play(space);
              $(this).val('');
              endGame();
              return false;
            }
            else if (keycode < 13 || keycode > 13 && keycode < 65 || keycode > 90){
              event.preventDefault();
            }
            else
              window.alert("You already guessed this letter.");

            }
  });

这也不起作用。 我还尝试创建另一个函数,仅处理将输入限制为与与游戏相关的 enter 键的函数分开的字母,该函数也不起作用/导致 enter 不触发这些事件(或者我的游戏不显示猜测字母或将正确的猜测注册为错误的猜测)以及只是做出一个条件语句if(keycode &gt; 65 || keycode &lt; 90) 这也导致了游戏或显示错误,我不确定我应该怎么做 - 我已经尝试了很多不同的方法一整天都无济于事,我们将不胜感激。 如果您需要了解整个游戏的运作方式,请查看我的 Fiddle 的链接: https://jsfiddle.net/KindeR99/wuftst3t/

编辑**:我已经尝试过 .alpha() jQuery 插件(虽然我想找到一个本地 JS/jQuery 解决方案),但它也对我不起作用(但我可能没有正确使用它)。我不确定为什么这些解决方案都不起作用/要么不限制输入或弄乱我的游戏功能。我也用正则表达式尝试了这种方法:

 $(".form-control").keypress(function(event) {
          var keycode = (event.keyCode ? event.keyCode : event.which);
          if (keycode == 13) {
            var space = $(this).val().toLowerCase();

            if (!(wrongGuesses.indexOf(space) > -1 || rightGuesses.indexOf(space) > -1) || space.length !== 1 || !space.match(/[a-z]/)) 
            {
              play(space);
              $(this).val('');
              endGame();
              return false;
            }
            else
              window.alert("That's restricted.");

            }
  });

这只是限制输入的键码:

$(".form-control").keypress(function(event) {
          var keycode = (event.keyCode ? event.keyCode : event.which);
          if (keycode > 65 || keycode < 90) {
            var space = $(this).val().toLowerCase();

            if (!(wrongGuesses.indexOf(space) > -1 || rightGuesses.indexOf(space) > -1)) {
              play(space);
              $(this).val('');
              endGame();
              return false;
            }
            else
              window.alert("You already guessed this letter.");

            } 
          else 
          {
          event.preventDefault();
          }  
  });

但是它们都弄乱了我的游戏或游戏功能的 html 显示(我不确定哪种方法是解决此问题的最佳方法,哪种方法对我的游戏功能影响最小)。仅在按下回车后才进行输入并不那么重要 - 我只是希望能够保持游戏功能不变,我不确定要走哪条路来解决这个问题 - 如果我知道哪种方法是最好的要正确执行此操作,我可以只关注该方法并尝试进行更深入的调试。

【问题讨论】:

  • 为什么不验证space 的长度为1 并进行简单的正则表达式匹配? if (space.length !== 1 || !space.match(/[a-z]/)) { alert('Bad input'); return; }
  • & 这实际上是一个好主意@Mike C - 可能会添加一个限制(以防止它发生)而不是警报......谢谢!
  • 我一直在尝试以您的方式修复此功能,例如 24 小时 @Mike C,但我无法正确使用语法,因为它会弄乱我的游戏显示或进入错误的猜测是正确的,反之亦然-我不确定自己做错了什么-我是这样尝试的:
  • $(".form-control").keypress(function(event) { var keycode = (event.keyCode ? event.keyCode : event.which); if (keycode == 13) { var space = $(this).val().toLowerCase(); if (!(wrongGuesses.indexOf(space) > -1 || rightGuesses.indexOf(space) > -1) || space.length !== 1 || !space.match(/[az]/)) { play(space); $(this).val(''); endGame(); return false; } else window.alert("这是受限的。") ; } });
  • 以及现在警报所在的位置@Mike C - 我不确定我做错了什么......

标签: jquery function input keypress jquery-events


【解决方案1】:

有助于改进游戏的两件事:

  1. 要在文本框中添加最大输入长度,请使用 maxlength 属性。

    &lt;input type="text" id="form" class="form-control" placeholder="guess" maxlength="1"&gt;

  2. 要仅限制字母输入并防止空字符串猜测,请将以下内容添加到您的 (".form-control").keypress 函数中

.

var keycode = event.keyCode ? event.keyCode : event.which;


if ((keycode < 64 || keycode > 91) && (keycode < 96 || keycode > 123) && keycode !== 13)
    return false;


if (keycode == 13) {
    var space = $(this).val().toLowerCase();

    if (space == '') {
        window.alert("Please enter a letter to guess.")
        return false;
    }

    if (wrongGuesses.indexOf(space) > -1 || rightGuesses.indexOf(space) > -1) {
        play(space);
        $(this).val('');
        endGame();
        return false;
    }
    else
        window.alert("You already guessed this letter.");
}

【讨论】:

  • omg,omg,你太棒了,谢谢你,我现在就解决这个问题 - 我刚刚尝试了很多不同的东西但无济于事 - 谢谢你!!!!我现在要开始做这个了!我一直在尝试 2 解决这个 4 这么久(& 不知道哪个是最好的 - 当 rlly 最好的方法 2 解决某事是 2 在调试上做很多工作一种方法而不是像谷歌搜索 20 种不同的方法 2 做某事并尝试一切都没有成功)...谢谢你@Ryan Dantzler-你太棒了! {我吓坏了,我也在期中考试,压力很大,所以谢谢你,谢谢你!!!! }
  • 很高兴为您提供帮助!请选择此作为接受的答案。
  • & 我早些时候尝试过这样的事情,但我在函数的不同位置有条件,只是在它不起作用时感到压力并放弃了这种方法(&也试图做太多w/in one function-限制表单html部分的最大长度是一个聪明而简单的解决方案)-我现在正在研究它-非常感谢@Ryan Dantzler!
  • 谢谢你@Ryan Dantzler!我会-我
  • 对不起,按下返回太快@Ryan Dantzler-我会的,我现在只是保存我的游戏-天哪,我昨晚尝试了一些如此相似的东西,但我有一个语法错误,所以我想所有逻辑一定已经关闭并陷入焦虑并完全放弃了那条路线,天哪-这教会了我很多关于做这一切的过程-谢谢!
【解决方案2】:

$.restrict() 正是为此目的。

【讨论】:

  • 哇,谢谢 - 我不知道 $.restrict() - 我现在会调查@Peter Varga - 谢谢!
猜你喜欢
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 2023-04-03
相关资源
最近更新 更多