1

それぞれ「1」と「2」という名前のスパンとテキスト入力が隣り合っています。一度に表示されるのは 1 つだけです。「one」をダブルクリックすると、「two」をフォーカスしたまま非表示になります。「二」をぼかすと隠れて「一」を見せる。エンターキーを押したときに「2」をぼかしようとすると、問題が発生します。ここに私が持っているものがあります:

.bind({'blur keyup': (function(e){
  if(e.type === 'keyup' && e.keyCode !== 10 && e.keyCode !== 13) return;
  $([this,$(this).prev()]).toggle(); })
 })

Enter キーを押すとトグルが発生しますが、どこかをクリックすると再び起動します。ぼやけたように見えますが、「2」はフォーカスを保持しています。 これは、2 つのリスナー (キーアップとブラー) が分離されているフィドルと、何が起こっているかを強調するのに役立つ追加のフィドルです。

私は試した

  • 追加e.preventDefault()
  • 追加return false(ぼかしの前) --> 残りの関数を強制終了します (予想どおり)
  • 追加return false(ぼかし後) --> エンターキー (??) を無効にするか、または後:
    • keyup: (return function(e){--> jQuery はこの構文を好みません
  • 別の関数で .toggle() を実行 --> 次の場合を除き、違いはありません:
    • setTimeout(時間が 0 の場合でも) --> 問題がなくなる
  • 別のリスナーを使用する (key[down/press]) --> 違いなし
  • 別の関数を呼び出す -> 違いはありません

質問: どうすればこれを修正できますか? 予想される動作は、Enter キーを押すと、 blur と同じアクションが得られることです。

4

1 に答える 1

1

理由はわかりませんが、jQuery の blur メソッドにやられていました。2 つのハンドラーを分離し、JavaScript のネイティブのぼかしメソッドを使用することで、問題を解決できました。

keyup: (function(e){
  if(e.keyCode===10 || e.keyCode===13){ this.blur(); }
}),
blur: (function(){
  $([this,$(this).prev()]).toggle();
})

私または他の誰かが jQuery のぼかしがこのように動作する理由を特定できるまで、これを開いたままにします。

于 2012-04-29T01:47:19.873 に答える