Codemirror 2.2清除所有标记

ic3*_*ic3 4 javascript codemirror

我想清除所有标记到codemirror文本.标记已创建调用

ret = codemirror.markText(..);
histMarks.push(ret);
Run Code Online (Sandbox Code Playgroud)

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

foreach( histMarks, i.clear() );  // this is pseudocode
Run Code Online (Sandbox Code Playgroud)

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

pur*_*101 8

如果您真正寻找"clearAllMarks"类型的功能,那么有一种更有效的方法.您甚至被迫在数组中捕获并存储所有标记的全部原因是因为它们不存储在codemirror实例中的任何位置.这表明无论他们在做什么.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;
    });
Run Code Online (Sandbox Code Playgroud)

我没有包含所有代码所以请随意仔细阅读(codemirror.js),但你应该注意的是,所有方法实际上都在做的工作是确保如果你调用clear它会删除标记正确的地方,因为没有理由你不能使用不同的标记将相同的css类添加到不同的行...并且清除一个不应该清除它们.该方法还更新了更改数组,该数组只是更改了哪些行的记录.

由于我们正在做一个"清除所有",我们并不真正关心删除一些而不是其他人,因此找出跨越标记影响的工作是没有必要的.另外,因为没有任何副作用,所以没有别的东西可以重置,所以你要做的就是删除css类.

因此,对于稍快的清除,您仍然需要使用标记存储标记或应用的类,以便您可以依次执行以下操作之一:

如果您仍然存储标记:

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

如果你只是存储类:

$('.handleToCodeMirrorEditor').removeClass(classes.join(" "));
Run Code Online (Sandbox Code Playgroud)

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

  • 存储标记并在每个标记上清除.
  • 存储标记并在每个特定样式上调用removeClass
  • 存储样式并在所有样式上调用removeClass(classes.join("")).

删除100个标记的结果如下:

297ms .clear
160ms .removeClass on each markerStyle
153ms .removeClass single call
Run Code Online (Sandbox Code Playgroud)

对于1000个标记:

4891ms .clear
2677ms .removeClass on each markerStyle
2572ms .removeClass single call
Run Code Online (Sandbox Code Playgroud)