2

特定のキーが入力ボックスに入力されないようにしようとしていますが、キーが押されている間にその特定のキーが押された場合のみshift:

$('selector').keydown(function(e) {
  console.log(e.shiftKey);
  if (e.shiftKey && e.which == 51) {
    e.preventDefault();
    alert('Disallowed');
  }
});

アラートは発生しますが、文字はテキスト ボックスに表示されたままです。

なぜこれが起こるのかについての説明を探してみましたが、役に立たなかったので、どんな助けでも大歓迎です!

編集

を削除するalertと問題が解決するようです (奇妙に思えます)。なぜこのように動作するのかを知りたいのですが、意味がないようです。

ありがとう

4

3 に答える 3

7

e.which代わりに使用するだけですe.keyCode

$('#input').keydown(function(e) {
  if (e.shiftKey && e.which == 51) {
    e.preventDefault();
    alert('Disallowed');
  }
});

作業サンプル

なぜなら、jQueryドキュメントから:

キー イベントまたはマウス イベントの場合、このプロパティは、押された特定のキーまたはボタンを示します。event.whichプロパティは、 event.keyCodeおよび event.charCodeを正規化します。キーボードのキー入力は event.whichを監視することをお勧めします。event.ボタンの押下 ( mousedown と mouseupevents )も正規化し、左ボタンの場合は1 、中央の場合は 2 、右の場合は 3 を報告します。event.buttonの代わりにevent.whichを使用します。

これを試してみてください.keyup()

$('#input').keyup(function(e) {
   var val = $.trim( this.value );
  if (e.shiftKey && e.which == 51) {
    $(this).val(val.replace(/\#/,''));
  }
});

デモ

</p>

入力からポンド記号を削除しようとしている場合は、次を試してください。

$(this).val( val.replace(/\u00A3/g, '') );

完全なコード

$('#input').keyup(function(e) {
   var val = $.trim( this.value );
  if (e.shiftKey && e.which == 51) {
    $(this).val( val.replace(/\u00A3/g, '') );
  }
});
于 2012-06-29T14:29:04.103 に答える
3

質問が今の場合: なぜalert()違いが生じるのですか?

alert面白いステートメント (and confirmand prompt) です。JavaScript の実行を一時停止しますが、JavaScript の実行を待っていた他のブラウザー処理を解放します。デバッグにかなり干渉する可能性があります。

preventDefault()ブラウザーは、JavaScript が終了するまでステートメントに応答しません。alertそこに挿入すると JavaScript が一時停止されます。そのため、ブラウザーはこの時点でイベントの戻りステータスを受け取っていません。残念ながら、alertブラウザーは他の処理を行うことができました。イベント、つまりkeypressこっそり通り過ぎるため、入力したくない文字が表示されます。

alert、または必要な場合 (?!) でラップして発行することもできます。これによりsetTimeout、JavaScript がブロックされず、 の結果によってが抑制されます。keydownkeypress

--

keypressまたは、そもそも使用できたはずです。

$('selector').keypress(function(e) {
  console.log(e.shiftKey);
  if (e.which == 163) {
    e.preventDefault();
    alert('Disallowed');
  }
});

それでも、別の方法で文字が入力されるのを防ぐことはできないので、個人的にはそもそもこれを楽しませません. :-/

于 2012-06-29T15:50:50.800 に答える
1
$('#selector').keydown(function(e) {
  console.log(e.shiftKey);
  if (e.shiftKey && e.keyCode == 51) {
    $(this).prop('disabled', true);
    //do something, fade an object in...display a message, etc
    setTimeout(function(){
      $(this).prop('disabled', false);
    }, 500);
  }
});

これは私にとってはうまくいきます。

編集

あなたの欲望を再現する setTimeout 関数を追加しました。

于 2012-06-29T14:42:38.383 に答える