2016-04-24 73 views
1

我遇到了一些功能问题。检测出焦点击键,集中输入并填充它(jquery)

当没有输入焦点时,我想要捕获用户按键,专注于特定输入,然后将所有已开始输入的文本输入到该输入中,然后输入任何前进的内容,直到他们移除焦点那个输入。

我的问题似乎是由于jquery的滞后?如果你开始输入“这仅仅是一个测试”成以下的jsfiddle

https://jsfiddle.net/bjgngayq/1/

HTML: <input type="text" id="search" /> 

JS: 
$(function() { 
    $(document).on('keypress', function(e) { 
     var tag = e.target.tagName.toLowerCase(); 
     if (e.which === 115 && tag != 'input' && tag != 'textarea' && tag != 'select') { 
      $('#search').focus(); 
      $('#search').val(String.fromCharCode(e.which)); 
     } 
    }); 
}); 

这似乎跳过前几个字母“氏”,然后加倍最后一个按键,你结束了“ ss只是一个测试“

可以有人(如果知道)在为什么这是发生和在哪里看。我正在寻找更多的原因而不是解决方案 - 如果我了解问题,我可以找出解决方案。

干杯。

回答

3

“Thi”被截断的原因是因为input在输入“s”之前没有被聚焦。这是因为在您的情况中包含了e.which === 115

你得到一个双“SS”的原因是因为你从实际按“S”键得到一个“s”手动从这一行$('#search').val(String.fromCharCode(e.which)),但随后又另一个“S”自动。

这应该做的伎俩:

$(function() { 
    $(document).on('keypress', function(e) { 
     var tag = e.target.tagName.toLowerCase(); 
     if (tag != 'input' && tag != 'textarea' && tag != 'select') { 
      $('#search').focus(); 
     } 
    }); 
}); 

或者,你可以更改为keyup事件,所以自动“S”没有得到类型,因为input不会获得焦点,直到后来。

工作小提琴:https://jsfiddle.net/bjgngayq/3/

+0

OK,如果输入的是隐藏的,我只好先取消隐藏什么?那么,当元素被隐藏时,焦点似乎被忽略了?是否可以放置某种类型的计时器,并缓存用户击键,直到元素具有焦点,然后将缓存复制并允许从那时开始的击键追加? – Trent

+0

@Trent是否应该在按键,取消隐藏和重点之间有任何有意的延迟?我不确定我是否理解需要定时器。 – digglemister

+0

@Trent为什么不在聚焦之前在'keypress'上使用'.show()':https://jsfiddle.net/bjgngayq/5/ – digglemister