You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在Ace Editor中仅使最后一行可编辑?如何设置只读区域?

Ace Editor 配置技巧:仅最后一行可编辑 & 设置只读区域

我来分享几个实用的实现方案,都是平时在项目里验证过的,帮你搞定这两个需求:


1. 让Ace Editor仅最后一行可编辑

最直接的方式是利用Ace的beforeChange事件拦截非最后一行的修改,具体代码如下:

// 初始化编辑器
const editor = ace.edit("editor");
editor.setTheme("ace/theme/monokai");
editor.getSession().setMode("ace/mode/javascript");

// 监听修改前事件,拦截非法操作
editor.on("beforeChange", function(e) {
    const session = editor.getSession();
    const lastLine = session.getLength() - 1; // Ace的行号从0开始计数
    
    // 判断修改的范围是否完全在最后一行内
    if (e.start.row !== lastLine || e.end.row !== lastLine) {
        e.preventDefault(); // 阻止修改非最后一行的内容
    }
});

额外说明:

  • 如果希望允许在最后一行换行后,新的最后一行也保持可编辑,上面的代码已经自动支持,因为lastLine会实时获取当前编辑器的最后一行行号。
  • 如果要固定某一行(比如初始加载时的最后一行),直接把lastLine改成固定值即可,比如const lastLine = 4;(对应第5行,行号从0开始)。

2. 为Ace Editor设置只读区域

同样可以通过beforeChange事件来实现,根据需要定义只读的行范围或字符范围:

方案1:整行只读(比如第1到第3行)

const editor = ace.edit("editor");
editor.setTheme("ace/theme/monokai");
editor.getSession().setMode("ace/mode/javascript");

// 定义只读区域的行范围(行号从0开始)
const readOnlyStartRow = 1;
const readOnlyEndRow = 3;

editor.on("beforeChange", function(e) {
    // 检查修改的区域是否和只读区域有交集
    const isOverlap = !(e.end.row < readOnlyStartRow || e.start.row > readOnlyEndRow);
    
    if (isOverlap) {
        e.preventDefault(); // 阻止修改只读区域
    }
});

方案2:字符级精确只读(比如第2行的0-10列)

如果需要更精细的控制,可以对比列号:

const editor = ace.edit("editor");
editor.setTheme("ace/theme/monokai");
editor.getSession().setMode("ace/mode/javascript");

// 定义精确的只读区域
const readOnlyRow = 2;
const readOnlyStartCol = 0;
const readOnlyEndCol = 10;

editor.on("beforeChange", function(e) {
    // 判断修改是否触及只读区域
    const touchesReadOnly = (e.start.row === readOnlyRow && e.start.col < readOnlyEndCol) ||
                           (e.end.row === readOnlyRow && e.end.col > readOnlyStartCol) ||
                           (e.start.row < readOnlyRow && e.end.row > readOnlyRow);
    
    if (touchesReadOnly) {
        e.preventDefault();
    }
});

额外说明:

  • 如果你想让只读区域更直观,可以给只读行添加样式,比如:
// 给只读行添加背景色
editor.getSession().setMarkerStyle("readonly", "background-color: #f5f5f5;");
const marker = editor.getSession().addMarker(
    new ace.Range(readOnlyStartRow, 0, readOnlyEndRow, Infinity),
    "readonly",
    "fullLine"
);

内容的提问来源于stack exchange,提问作者shiningStar

火山引擎 最新活动