javascript - Codemirror 2.2清除所有标记

标签 javascript codemirror

我希望清除代码镜像文本的所有标记。标记已创建调用

ret = codemirror.markText(..);
histMarks.push(ret);

要删除所有标记,我们将逐一清除:

foreach( histMarks, i.clear() );  // this is pseudocode

是否有更有效的方法来删除所有标记?

最佳答案

如果您确实在寻找“clearAllMarks”类功能,则有一种稍微更有效的方法。您甚至被迫自己捕获所有标记并将其存储在数组中的全部原因是因为它们没有存储在代码镜像实例中的任何位置。这表明无论他们在 .clear 上做什么都是独立的(也就是说,每个 TextMarker 都拥有它自己存储的清除所需的所有信息。)。确定之后,我们可以看一下 markText() 和 .clear 函数:

function markText(from, to, className, options) {
      from = clipPos(from); to = clipPos(to);
      var marker = new TextMarker("range", className);
      if (options) for (var opt in options) if (options.hasOwnProperty(opt))
        marker[opt] = options[opt];
      var curLine = from.line;
      doc.iter(curLine, to.line + 1, function(line) {
        var span = {from: curLine == from.line ? from.ch : null,
                    to: curLine == to.line ? to.ch : null,
                    marker: marker};
        line.markedSpans = (line.markedSpans || []).concat([span]);
        marker.lines.push(line);
        ++curLine;
      });
      changes.push({from: from.line, to: to.line + 1});
      return marker;
    }
TextMarker.prototype.clear = operation(function() {
      var min, max;
      for (var i = 0; i < this.lines.length; ++i) {
        var line = this.lines[i];
        var span = getMarkedSpanFor(line.markedSpans, this);
        if (span.from != null) min = lineNo(line);
        if (span.to != null) max = lineNo(line);
        line.markedSpans = removeMarkedSpan(line.markedSpans, span);
      }
      if (min != null) changes.push({from: min, to: max + 1});
      this.lines.length = 0;
      this.explicitlyCleared = true;
    });

我没有包含所有代码,所以您可以自己仔细阅读它 ( codemirror.js ), 但是你应该注意的是,所有方法真正做的是确保如果你调用 clear 它会从正确的位置删除标记,因为没有理由你不能将相同的 css 类添加到不同的使用不同标记的线......清除一个不应该清除两个。该方法还更新更改数组,它只是更改了哪些行的记录。

由于我们正在执行“全部清除”,因此我们并不真正关心删除一些而不是其他,因此没有必要确定标记影响的跨度。此外,由于 markText 没有副作用,因此无需重置任何其他内容,因此您所做的一切的核心就是删除 css 类。

因此,为了稍微更快地清除,您仍然必须存储标记或使用标记应用的类,以便您可以依次执行以下操作之一:

如果您仍然存储标记:

for (var i = 0;i<markers.length;i++)
    $('.handleToCodeMirrorEditor').removeClass(markers[i].style);

如果你只是存储类:

$('.handleToCodeMirrorEditor').removeClass(classes.join(" "));

基准测试:虽然我很清楚有效的基准测试通常是一项棘手的任务,但我认为至少对各种方法进行一些测试是值得的。 我设置了一个测试,其中我添加了一定数量的标记,每个标记应用不同的类(按索引递增)。然后,我运行并计时了 3 种不同的方法来分别移除这些标记。我以不同的顺序多次运行每个测试以确保一致的结果。 我比较了 3 种方法:

  • 存储标记并在每个标记上调用 clear。
  • 存储标记并在每个特定的对象上调用 removeClass 风格
  • 存储样式并对所有样式调用 removeClass (classes.join(""))。

去除100个标记结果如下:

297ms .clear
160ms .removeClass on each markerStyle
153ms .removeClass single call

对于 1000 个标记:

4891ms .clear
2677ms .removeClass on each markerStyle
2572ms .removeClass single call

关于javascript - Codemirror 2.2清除所有标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9000844/

相关文章:

javascript - CodeMirror 初始化值不工作

javascript - Javascript 中不同排序标准的相同输出

javascript - 为什么 `undefined` 没有出现在 for...in 循环中?

javascript - 我怎样才能限制该图像不调整超过特定限制

javascript - Codemirror setGutterMarker 样式

javascript - 我不断收到 "CodeMirror.foldCode is not a function"。代码折叠插件不适用于自定义/简单模式吗?

javascript - Highcharts JS - 在饼图之间共享图例颜色

javascript - 单击后仅添加一次新元素并将其保存到本地存储 html javascript

codemirror - 如何执行用Codemirror textarea编写的代码?