2012-01-25 5 views
2

私はすべてのマークをcodemirrorのテキストにクリアします。Codemirror 2.2すべてのマークをクリアする

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

は、すべてのマークを削除するためのより効率的な方法があります:マークは、我々が個別に各1をクリアしているすべてのマークを削除するには

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

を呼び出す作成されていますか?

+0

マークされたテキストをクリアする他の手段のドキュメントでは言及はありませんが、私はこれを行うための他の方法がないと予想します。パフォーマンスについて懸念していますか? – NT3RP

答えて

5

「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)を熟読すること自由に感じ、 しかし、何をすべき注目すべき点は、すべてのメソッドが実際に行っていることは、呼び出し元が正しいマーカーを削除しても、別のマーカーを使用して同じ行に同じCSSクラスを追加できない理由がないことを保証することです...一つをクリアすると両方をクリアしてはいけません。このメソッドは、変更された行のレコードだけである変更配列も更新します。

私たちは「すべてをクリア」しているので、マーカーを削除することは実際には気にしないので、マーカーの影響範囲を把握する作業は必要ありません。また、markTextの副作用がないので、リセットする必要はありません。したがって、心の中では、CSSクラスを削除するだけです。

それでもマーカーを保存する場合:

このように、わずかに速く明確なために、あなたはまだどちらかのマーカーまたはクラスを保管しなければならないあなたは、マーカーを使用して適用されますが、順番に次のいずれかを行うことができますので、

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

あなただけのクラスを保存する場合:

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

ベンチマーク:私は効果的なベンチマークは、しばしばトリッキーな作業になる可能性があることも承知していますが、私は、少なくとも、さまざまな方法論のテストを実行することは価値があると考えました。 私は、それぞれ異なるクラスを適用する(インデックスによって増分される)特定の数のマーカーを追加したテストをセットアップしました。その後、それぞれを分離して取り除くための3つの異なる方法を実行し、時間を計った。一貫性のある結果を得るために、さまざまな順序で各テストを何回か実行しました。 私は、3つの方法を比較しました:マーカーを保存し、それぞれをクリアするメソッドを比較しました:

  • マークを保存し、それぞれの具体的なものにremoveClassを呼び出します。 スタイル
  • すべてのスタイル(classes.join( ""))でスタイルを保存し、removeClassを呼び出します。次のような結果を除去するために100個のマーカーの

は以下の通りであった。

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

千個のマーカーについて:

4891ms .clear 
2677ms .removeClass on each markerStyle 
2572ms .removeClass single call 
関連する問題