シンタックスハイライトを書いています。ハイライターは、テキストを入力して矢印キーでナビゲートするとすぐに強調表示を更新する必要があります。キー押しイベントが発生した後のテキストカーソル位置の取得方法は?
私が直面している問題は、 'keypress'イベントが発生すると、まだテキストカーソルの古い位置がwindow.getSelection()
であるということです。
例:例では
function handleKeyEvent(evt) {
console.log(evt.type, window.getSelection().getRangeAt(0).startOffset);
}
var div = document.querySelector("div");
div.addEventListener("keydown", handleKeyEvent);
div.addEventListener("keypress", handleKeyEvent);
div.addEventListener("input", handleKeyEvent);
div.addEventListener("keyup", handleKeyEvent);
<div contenteditable="true">f<span class="highlight">oo</span></div>
、単語 'foo' で前にキャレットを置き、その後、(右矢印キー)→を押してください。
お気に入りのDevToolのコンソールで次のように表示されます:
keydown 0
keypress 0
keyup 1
0
keypress
以外は明らかに古いキャレット位置していること。
keydown 0
keypress 0
keydown 1
keypress 1
keydown 1
keypress 1
keydown 2
keypress 2
keyup 2
私は何を取得したいが、私は「からkeyup」または「入力」のそれを得るのと同じように新しいキャレット位置がある:あなたがダウン少し長く→保持する場合は、このような何かを得るでしょう。 「キーアップ」は遅すぎます(実際に何らかの入力があったとしても入力が行われませんが、→は入力を生成しません)。
入力時だけでなく、キャレット位置が変更された後に発生するイベントはありますか?または、テキストカーソルの位置を計算する必要がありますか? (私はこれはときにテキストラップはかなり複雑に得ることができ、あなたが↓(下矢印キー)を押すと仮定します。)
keypressイベントを使用して別の問題があると思います。矢印キーを押すとChromeがイベントを発生させないように見えます(Firefoxはそうです)。ステータスWontFixに古いクロムバグがあります。https://bugs.chromium.org/p/chromium/issues/detail?id=2606 – Alex
ヒントありがとうございます!そうです、 'keypress'イベントは発生しませんが、明らかに廃止とマークされています(https://www.w3.org/TR/uievents/#legacy-keyboardevent-event-types)。私が今見たように、この仕様では、人々は代わりに 'beforeinput'イベントを使うことを勧められていると述べています。また、「キーダウン」も継続して発砲される。これらすべての出来事は早すぎて解雇されます。私は[UI Events spec。](https://github.com/w3c/uievents/issues/111)に問題を提出して、これに対する適切なイベントを得ることを希望しました。 –
カーソルの位置/選択などは、まだすべてのブラウザでサポートするピタです。私はこれを必要としている間はしばらくしていましたが、カーソルに関連するものでは、[ランジ](https://github.com/timdown/rangy)は非常に固いものです。 –