2016-04-24 10 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)); 
     } 
    }); 
}); 

を入力し始める場合、それは「ティ」最初の数文字を飛ばしているようだと、最後のキーの押下を倍増、あなたが "で終わります唯一のテストです "

誰かが(もし知られていれば)に何かを照らすことができますか?これは起こっている場所です。私は解決策よりも理由を探しています。問題が分かっていれば解決策を見つけることができます。

乾杯。

答えて

3

"Thi" getが打ち切られる理由は、 "s"が入力されるまでinputにフォーカスがないためです。これはあなたの状態にe.which === 115が含まれているためです。

ダブル "ss"を取得するのは、この行から手作業で "s"を手に入れているからです。$('#search').val(String.fromCharCode(e.which))でも実際には "s"キーを押すと自動的に別の "s"が自動的に表示されます。

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

また、あなたがkeyupイベントに変えることができるので、inputはその後になるまでフォーカスを得ることはありませんので、「s」は自動で、入力されたされません。

これはトリックを行う必要があります。

の作業フィドル:https://jsfiddle.net/bjgngayq/3/

+0

OK、何その入力が隠されて、私は最初にそれを再表示しなければなりませんでしたか?要素は隠されているので、フォーカスは一見無視されますか?いくつかのタイプのタイマーをオンにして、要素にフォーカスがあるまでユーザーのキーストロークをキャッシュし、キャッシュをコピーしてからキーストロークを追加することができますか? – Trent

+0

@Trentキー押し、再表示、フォーカスの間に意図的な遅延があるのでしょうか?私はタイマーの必要性を理解しているかどうか分からない。 – digglemister

+0

@Trentフォーカスする前に 'keypress'に' .show() 'を使ってみるのはどうでしょうか?https://jsfiddle.net/bjgngayq/5/ – digglemister