5

すべてのマークを codemirror テキストにクリアしようとしています。マークは呼び出して作成されました

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

すべてのマークを削除するには、それぞれを個別にクリアします。

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

すべてのマークを削除するより効率的な方法はありますか?

4

3 に答える 3

10

本当に「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;
    });

すべてのコードを含めていないので、自由に自分で調べてください ( codemirror.js )。ただし、すべてのメソッドが実際に行っているのは、clear を呼び出している場合にマーカーを削除することを確認する作業だけであることに注意してください。異なるマーカーを使用して同じcssクラスを異なる行に追加できなかった理由がないため、正しい場所...そして1つをクリアしても両方をクリアするべきではありません。このメソッドは、変更された行の単なる記録である changes 配列も更新します。

「すべてクリア」を行っているため、一部を削除して他を削除することはあまり気にしません。そのため、マーカーが影響を与える範囲を把握する作業は必要ありません。また、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
于 2012-12-06T18:36:16.103 に答える