Существует несколько более эффективный способ, если вы действительно ищете функциональность «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 метода:
- хранение маркеров и чистка каждого из них.
- Хранение разметки и вызова 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