我希望清除代码镜像文本的所有标记。已经创建了标记
ret = codemirror.markText(..);
histMarks.push(ret);
要删除所有标记,我们将逐个清除每个标记:
foreach( histMarks, i.clear() ); // this is pseudocode
是否有更有效的方法来删除所有标记?
答案 0 :(得分: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;
});
我没有包含所有代码,所以请随意仔细阅读(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种方法:
要删除100个标记,结果如下:
297ms .clear
160ms .removeClass on each markerStyle
153ms .removeClass single call
对于1000个标记:
4891ms .clear
2677ms .removeClass on each markerStyle
2572ms .removeClass single call
答案 1 :(得分:0)
//for marking a text and storing it
var cursor = this.instance.getSearchCursor(val);
var scopedInstance = this;
while (cursor.findNext())
{
this.histMarks.push(scopedInstance.instance.markText(cursor.from(), cursor.to(), { className: 'highlight' }));
}
//for removing a marked text by specific intention
for (var i = 0;i < this.histMarks.length;i++)
{
for (var j = 0;j < this.histMarks[i].lines.length;j++)
{
if(this.histMarks[i].lines[j].text.includes(val))
{
this.histMarks[i].clear();
this.histMarks.splice(i, 1);
}
}
}
答案 2 :(得分:0)
最干净的解决方案是提取所有标记,然后清除它们
editor.doc.getAllMarks().forEach(marker => marker.clear());
或在上述情况下
this.instance.doc.getAllMarks().forEach(marker => marker.clear());