我正在尝试仅用一行文本来设置Ace编辑器。

这个想法是模仿<input type="text">框的行为,但是使用语法着色:
javascript - 单行Ace编辑器-LMLPHP

当前,如果用户在编辑器中按下Enter,则会创建新行:
javascript - 单行Ace编辑器-LMLPHP

所以我的问题是:

如何将Ace设置为仅允许一行(如标准文本输入框)?

以下是到目前为止我已经尝试过的方法,以及未成功的原因。

  • 如果editor.undo() ,则在change上调用e.lines.length > 1
    问题是,在对增量进行实际更改之前会触发change,因此undo()在这里不起作用(或与先前的增量有关)
  • 如果keypress ,则取消Event.which = 13
    它可以工作,但很脏,不能处理粘贴多行文本的情况,因此我们也需要处理paste事件-这会使该解决方案更加肮脏。我也非常有信心将考虑更多的极端情况。
  • 尝试“空” e中的on("change", function(e) { ... })

    例如,在回调函数中说e = {},前提是e只是对实际对象的引用。没有任何效果。
  • 尝试在Ace编辑器中找到一个内置参数来完成该操作

    找不到这样的参数还没有成功...
  • 最佳答案

    由于某种原因,e.preventDefaulte.stopPropagation在更改事件处理程序中均不起作用。但是您可以进行查找替换。

    参见 fiddle :http://jsfiddle.net/vittore/3rLfdtxb/

     var editor = ace.edit("editor");
     editor.setTheme("ace/theme/monokai");
     editor.getSession().setMode("ace/mode/javascript");
     editor.setFontSize(30)
     editor.getSession().on('change', function(e) {
        console.log(e)
        if (e.data.text.charCodeAt(0) === 10 && e.data.action == "insertText") {
          console.log('cancel event')
          //e.preventDefault() // doesnt work
          //e.stopPropagation()  // doesnt work
          editor.find(String.fromCharCode(10))
          editor.replaceAll(''); // this work
        }
     })
    

    您甚至可以从处理程序中删除if语句,并在发生任何更改时替换换行符,无论如何。

    当您找到更改时,您会从光标到所选行的末尾找到一行。为了在此之后取消选择,请使用:
    editor.selection.clearSelection()
    

    关于javascript - 单行Ace编辑器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32315244/

    10-12 18:09