contentEditabledivに押されているすべてのキーをインターセプトする必要がある状況があります。しかし、キープレスイベントが発生した場合、私が発生した場合、
document.getElementById("divEditor").innerHTML
全文を取得できません(最後の文字が押されていません)
また、キーアップイベントは、キーを押し続けても発生しません。全体の価値を持つ重要なイベントを開催するにはどうすればよいですか?
contentEditabledivに押されているすべてのキーをインターセプトする必要がある状況があります。しかし、キープレスイベントが発生した場合、私が発生した場合、
document.getElementById("divEditor").innerHTML
全文を取得できません(最後の文字が押されていません)
また、キーアップイベントは、キーを押し続けても発生しません。全体の価値を持つ重要なイベントを開催するにはどうすればよいですか?
keyup
キーを押した後の状態を確認できる唯一のイベントです。
keydown
1 つの方法は、キーを押した後に何らかの処理を行うためにタイムアウトをトラップして設定することです。
input.onkeydown= function() {
setTimeout(function() {
// do something
}, 1);
};
ただし、キーを押さずに編集できる場合 (通常は、ドラッグ アンド ドロップやカット アンド ペーストなどのメニュー項目を使用します)、キー イベントをいくらチェックしても役に立ちません。代わりに、単に状態をポーリングして、状態が変化したかどうかを確認する必要があります。これを onkeyup ハンドラまたは onkeydown タイムアウトでバックアップして、その特定のケースの更新をより迅速に行うことができます。
var oldstate= input.value;
function checkState() {
if (input.value!=oldstate) {
// do something
oldstate= input.value;
}
}
setInterval(checkState, 1000);
input.onkeyup= checkState;
(これは単純化のために input 要素を使用しますが、contentEditable にも同様に適用できます。)
最善の方法は、INPUT フィールド ( position:absolute; left:-1000px
) を用意し、それに 3 つのイベント ( keydown keypress keyup
) をすべて追加することです。
これで、この入力フィールドの値を使用してCTRL + Z
動作し、値を貼り付けることができます。
入力フィールドにFocusを設定するだけです。
var user_action = function ()
{
document.getElementById("divEditor").innerHTML = document.getElementById("myhiddenInput").value;
};
document.getElementById("myhiddenInput").onchange = user_action;
document.getElementById("myhiddenInput").onkeydown = user_action;
document.getElementById("myhiddenInput").onkeyup = user_action;
document.getElementById("myhiddenInput").onkeypress = user_action;
document.getElementById("divEditor").onclick = document.getElementById("myhiddenInput").focus;