【问题标题】:Determine if input keyEvent added or removed something确定输入 keyEvent 是否添加或删除了某些内容
【发布时间】:2014-01-29 08:19:42
【问题描述】:

假设我在输入字段上使用 jQuery 捕获一个 keyup 事件。现在我正在对事件做各种事情,例如对选项卡或输入键做出反应。现在我想确定是否按下了诸如 tab、control、alt、shift 之类的键,或者是否按下了实际改变输入(例如字母、数字、标点符号等)的键。

有什么方法可以确定吗?如何确保检查任何用户在任何地方都可以按下的所有正确键?

我希望我的问题很清楚。

编辑 1:

嗯,我很快就结束了这个问题。还有一个问题。到目前为止我的解决方案(JSFiddle):

$('input').keyup(function(e) {
    var lastValue = '';
    if(typeof $(this).attr('data-last-value') != 'undefined' && $(this).attr('data-last-value') != '') {
        lastValue = $(this).attr('data-last-value');
    }

    if(lastValue != $(this).val()) {
        //This is what I wanted.
    }

    $(this).attr('data-last-value', $(this).val());
});

问题:例如,如果用户在输入中输入“hello”,然后选择“h”并按下 h 键,则脚本不会将其识别为所需的按键之一,因为该值不是改变。有什么办法可以解决这种行为吗?

【问题讨论】:

  • 你能提供一个你描述的问题的工作小提琴吗?有点难以理解你想要什么
  • 我添加了小提琴。问题:如果用户按下一个键来编辑内容(例如字母、标点符号、退格等),但当按下其他键(例如 alt、shift、left、right、tab 等)时,我希望条件为真.如何区分这两种类型的键?
  • 如果输入没有改变,为什么你需要跟踪被按下的字母?如果您真的需要跟踪它,我认为您需要检查所有可能的非字母键码并检查它们。
  • 在我的特殊情况下,用户希望在输入有效值后焦点立即跳转到下一个输入字段。有时这只是一个字母。因此,如果他们例如通过按制表符将焦点放在包含单个字母的输入上,他们可能会再次按该字母并期望被发送到下一个输入。
  • 知道了。看看我的更新应该真的有效。

标签: jquery events input onkeyup


【解决方案1】:

也许一种可能的解决方案是在更改输入之前保存输入的长度,并在某些事件中检查新的长度,即:

var inputsLength = {};

$(window).keydown(function (e){
  var input = e.eventTarget,
      name = input.name,
      oldLength = inputsLength[name];

  if (!oldLength) {
    inputsLength[name] = input.length
  }

  if (oldLength !== input.length) {
    //something change
  } else {
    //everything is the same
  }

  if (e.ctrlKey) alert("control");
});

您更新问题的替代解决方案是使用“输入”事件,该事件仅捕获您在这种情况下真正想要的内容。

$(window).on('input', function(e) {
    //Do what you need
});

附:请记住,这在 IE

【讨论】:

  • 感谢您的回答!我稍微修改了它以存储输入的旧值,而不仅仅是长度以捕获替换字母。现在它就像一个魅力!
  • 对不起,我接受这个有点快。我编辑了这个问题,因为这个解决方案仍然存在问题。
【解决方案2】:

简而言之,KeyCodes。

$('element').keyup(function (e) {
    var event = e || window.event; //for firefox mainly
    switch (e.keyCode) {
        case 13:
            //do something here (keycode 13 is enter)
            break;
        //continue for all keycodes you are checking for
    }

    //alternatively
    var modKeys = [69, 70, 71]; //ect... (keys which will modify the input)
    var otherKeys = [9, 13, 16]; // ect... (keys which wont)

    if ($.inArray(e.keyCode, modKeys)) {
        //code for modification key
    } else if ($.inArray(e.keyCode, otherKeys)) {
        //code for non-modification keys
    }
});

编辑: 获取键码列表:http://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes

【讨论】:

    【解决方案3】:
    $(window).keydown(function (e){
        if (e.ctrlKey) alert("control");
    });
    

    修饰键列表:

    e.ctrlKey
    e.altKey
    e.shiftKey
    

    【讨论】:

    • 是的,但是例如 NumKey、上、下、左、右等等。有很多钥匙需要注意。如何捕获不直接影响输入内容的所有键?
    • 查看 ascii 表,看看你能接受和不能接受的键范围。
    【解决方案4】:

    试试这个

    <input type="text" id="txtboxToFilter" />
    
    (document).ready(function() {
        $("#txtboxToFilter").keyu[(function(event) {
    
            if (event.ctrlKey == true)
                alert("control key pressed");
            //or you can do something like this also using key codes
            if (event.keyCode == 9)
                alert("tab key pressed");
    
            }
    
        });
    });
    

    JavaScript Key Codes

    【讨论】:

    • 我的问题是:几乎不可能检查所有键盘布局上的所有可能键。
    猜你喜欢
    • 2019-11-29
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    相关资源
    最近更新 更多