2

ace エディターは、keydown イベントの発生を防ぎます。と思いますpreventDefault

エディターイベントが実行される前に、この防止を削除したり、keydown イベントにバインドしたりするにはどうすればよいですか?

4

2 に答える 2

5

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){...}})
于 2012-12-28T09:16:12.503 に答える
3

また、オプションでカーソルキーの押下をフィルタリングできるようにしたいと考えていました (そして、それらを代わりにポップアップで消費します)。この機能を次のコードで挿入できました。

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);
    }
}

この場合、テキストは改行です。

于 2013-02-06T08:41:19.943 に答える