【问题标题】:Get key code / click / which triggered change event获取键码/点击/触发更改事件
【发布时间】:2016-05-25 13:12:23
【问题描述】:

是否可以从(jquery)更改事件处理程序中找出触发更改事件的原因 - 按下哪个键或鼠标单击?

我的用例:我有 input[type=text] 项目的动态列表,如果用户填写最后一个空项目,我会为另一个项目添加新的 input[type=text]。如果用户按下选项卡(触发了更改事件),我想自动聚焦它,但不是例如当用户点击某处时(因此也触发了更改,但用户可能想要关注其他内容)。

简化示例:

https://jsfiddle.net/yxu82p1o/1/

<input type=text>
<script>
function addMore() {
  $('input').off('change.addMore');
  $('<input type=text>').insertAfter($('input').last()).on('change.addMore', addMore);
}
$('input').on('change.addMore', addMore);
</script>

PS。我可以找出解决方法,例如附加另一个 keyup 事件并从中找出按下的键,但从更改事件中找出导致它的原因会更简单、更清晰。

【问题讨论】:

  • e 添加到addMore 参数中:addMore(e),然后检查e.which 是否为键盘或e.button 为鼠标
  • @bozdoz - e.whiche.buttonchange 上将是 undefined,至少在 chrome 中,或者我在这里遗漏了什么?

标签: javascript jquery onchange


【解决方案1】:

这可能是一个选项。侦听input 元素上的keydown 事件,如果TAB 键触发了事件并且该元素是input 元素,则触发change 元素上的change 事件。然后聚焦动态添加的input元素。

function addMore() {
  $('input').off('change.addMore');
  $('<input type=text>').insertAfter($('input').last()).on('change.addMore', addMore);
}
$('input').on('change.addMore', addMore);

$('body').on('keydown', 'input', function(e){
  var keyCode = e.keyCode || e.which; 
  if (keyCode == 9 && this.tagName === "INPUT") {
    e.preventDefault();
    $(this).change();
    $(':text').last().focus();
  } 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<input type=text>

【讨论】:

  • 谢谢,这是一个非常简单的解决方法,但仍然是一种解决方法 - 如果没有人直接回答,如果我可以确定更改事件的原因,我会接受它;)
  • 当然,没问题。当“文本”类型的输入元素失去焦点时,我不知道如何从change 事件中获取keyCode 信息,但也许其他人有更好的主意。不过,它会很好。 ;)
猜你喜欢
  • 1970-01-01
  • 2023-03-27
  • 2016-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
  • 2011-11-19
  • 1970-01-01
相关资源
最近更新 更多