web-dev-qa-db-ja.com

キープレスを変更する

入力ボックスまたはcontenteditable = true divで、文字「a」のキープレスを変更して文字「b」のキーブレスを返すにはどうすればよいですか?つまり、divに文字「a」を入力するたびに、出力は実際には文字「b」になります。

私はIEで機能するソリューションにはそれほど関心がありません。Safari、Chrome、FFで機能するソリューションだけです。

Chromeでは、keypressイベントに「charCode」、「keyCode」、「which」のプロパティがあり、すべてkeypressイベント番号が割り当てられていることがわかります。キーを押したときにイベントを発生させると、これらの値を変更できますが、入力する実際のキーが異なるように、何を返すかわかりません。例えば:

$(window).keypress(function(e){  //$(window) is a jQuery object
    e.charCode = 102;
    e.which = 102;
    e.keyCode = 102;
    console.log(e);
    return e;
});

CharCode、that、およびkeyCodeとともに、「originalEvent」プロパティがあり、これらのプロパティも順にあることもわかります。しかし、それらを変更することはできませんでした(e.originalEvent.charCode = 102などで試しました)。

28
maxedison

キーイベントに関連付けられたキャラクターやキーを変更したり、キーイベントを完全にシミュレートしたりすることはできません。ただし、キープレスを自分で処理し、現在の挿入ポイント/キャレットに必要な文字を手動で挿入することができます。 Stack Overflowのさまざまな場所でこれを行うコードを提供しました。 contenteditable要素の場合:

次にjsFiddleの例を示します。 http://www.jsfiddle.net/Ukkmu/4/

入力の場合:

クロスブラウザーのjsFiddleの例: http://www.jsfiddle.net/EXH2k/6/

IE> = 9および非IE jsFiddleの例: http://www.jsfiddle.net/EXH2k/7/

29
Tim Down

さて、あなたは<input>または<textarea>は、値に「a」文字が含まれていないことを確認するだけです。

$('input.whatever').keypress(function() {
  var inp = this;
  setTimeout(function() {
    inp.value = inp.value.replace(/a/g, 'b');
  }, 0);
});

このアプローチでは、「押された」文字を実際にスワップアウトしたもので引き出す可能性のあるすべてのトリックを処理できなかった可能性がありますが、実際にそれを行う方法はわかりません。

編集 —おお、そしてタイムアウトハンドラーで発生する「fixup」を使用してその例で入力した理由は、ブラウザーが「キープレス」のネイティブ動作を処理する機会があることを確認するためです"イベント。タイムアウトハンドラーコードが実行されると、要素の値が更新されたことが確実になります。貨物カルトのこのコードへの接触が少しあると私は理解しています。

1
Pointy

私のソリューションの例(input[type=text] キャラクター ',''.'):

element.addEventListener('keydown', function (event) {
if(event.key === ','){
  setTimeout(function() {
    event.target.value += '.';
  }, 4);
  event.preventDefault();
};
1
Boyko Oleksiy

これが「簡単に」実行可能かどうかはわかりませんが、次のようなものがあります。

$(window).keypress(function(e) { 
    //Captures 'a' or 'A'
    if(e.which == 97 || e.which == 65)
    {
        //Simulate a keypress in a specific field  
    }
});

JQueryにはkeypressイベントなどをシミュレートするシミュレートプラグインがあることは知っています jQuery Simulate 。調べてみる価値があるかもしれません-おそらくある種のjQuery Trigger() イベントも。

0
Rion Williams

これは、ライブラリを使用しない例です

const input = document.querySelector('input')

// this is the order of events into an input
input.addEventListener('focus', onFocus)
input.addEventListener('keydown', keyDown)
input.addEventListener('keypress', keyPress)
input.addEventListener('input', onInput)
input.addEventListener('keyup', keyUp)
input.addEventListener('change', onChange)
input.addEventListener('blur', onBlur)

function onFocus  (event) { info(event) }
function keyDown  (event) { info(event) }
function keyPress (event) {
  info(event)
  // this 2 calls will stop `input` and `change` events
  event.preventDefault();
  event.stopPropagation();
  
  // get current props
  const target = event.target
  const start = target.selectionStart;
  const end = target.selectionEnd;
  const val = target.value;
  
  // get some char based on event
  const char = getChar(event);
  
  // create new value
  const value = val.slice(0, start) + char + val.slice(end);
  
  // first attemp to set value
  // (doesn't work in react because value setter is overrided)
  // target.value = value

  // second attemp to set value, get native setter
  const nativeInputValueSetter = Object.getOwnPropertyDescriptor(
    window.HTMLInputElement.prototype,
    "value"
  ).set;
  nativeInputValueSetter.call(target, value);

  // change cursor position
  target.selectionStart = target.selectionEnd = start + 1;
  
  // dispatch `input` again
  const newEvent = new InputEvent('input', {
    bubbles: true,
    inputType: 'insertText',
    data: char
  })
  event.target.dispatchEvent(newEvent);
}
function keyUp    (event) { info(event) }
function onInput  (event) { info(event) }
function onChange (event) { info(event) }
function onBlur   (event) {
  // dispatch `change` again
  const newEvent = new Event('change', { bubbles: true })
  event.target.dispatchEvent(newEvent);
  info(event)
}

function info     (event) { console.log(event.type) }

function getChar(event) {
  // will show X if letter, will show Y if Digit, otherwise Z
  return event.code.startsWith('Key')
    ? 'X'
    : event.code.startsWith('Digit')
      ? 'Y'
      : 'Z'
}
<input type="text">
0
Andrew Luca

バニラJavaScriptを使用して,.に置き換える簡単な例を次に示します

// change ',' to '.'
document.getElementById('only_float').addEventListener('keypress', function(e){
    if (e.key === ','){
        // get old value
        var start = e.target.selectionStart;
        var end = e.target.selectionEnd;
        var oldValue = e.target.value;

        // replace point and change input value
        var newValue = oldValue.slice(0, start) + '.' + oldValue.slice(end)
        e.target.value = newValue;

        // replace cursor
        e.target.selectionStart = e.target.selectionEnd = start + 1;

        e.preventDefault();
    }
})
<input type="text" id="only_float" />
0