ace エディターは、keydown イベントの発生を防ぎます。と思いますpreventDefault
。
エディターイベントが実行される前に、この防止を削除したり、keydown イベントにバインドしたりするにはどうすればよいですか?
ace エディターは、keydown イベントの発生を防ぎます。と思いますpreventDefault
。
エディターイベントが実行される前に、この防止を削除したり、keydown イベントにバインドしたりするにはどうすればよいですか?
ace は、すでに処理したイベントのみを停止します。キャプチャ イベント リスナ (editor.container.addEventListener("keydown", handler, true)) を使用するか、ace のコマンド ハンドラを使用できます。
更新: ace コマンドのみをブロックするには、イベント ハンドラーのキャプチャが機能する場合がありますが、キーコードの大きなスイッチよりも ace hashHandler の方が優れている場合があります。
HashHandler = require("ace/keyboard/hash_handler").HashHandler
var turn = 0
var h = new HashHandler([{
bindKey: "Up",
descr: "Block cursor movement smetimes",
exec: function(ed){
turn++
if (turn % 2)
return false // allow other ace commands to handle event
}
}])
editor.keyBinding.addKeyboardHandler(h)
// editor.keyBinding.removeKeyboardHandler(h)
またはよりコンパクトなフォーム
var h = new HashHandler()
h.bindKeys({"Up": function(ed){...}})
また、オプションでカーソルキーの押下をフィルタリングできるようにしたいと考えていました (そして、それらを代わりにポップアップで消費します)。この機能を次のコードで挿入できました。
editor.keyBinding.origOnCommandKey = editor.keyBinding.onCommandKey;
editor.keyBinding.onCommandKey = function(e, hashId, keyCode) {
if (...) {
this.origOnCommandKey(e, hashId, keyCode);
}
}
keyCode 38 はカーソルアップ、keyCode 40 はダウン、13 はエンターを表します。元の関数が呼び出されない場合、Ace はこのキーが押されたことを認識しません。残念ながら、リターン キーはまだ Ace によって消費されています。
これは、同様の解決策で防ぐことができます。
editor.keyBinding.origOnTextInput = editor.keyBinding.onTextInput;
editor.keyBinding.onTextInput = function(text) {
if (...) {
this.origOnTextInput(text);
}
}
この場合、テキストは改行です。