Я нашел решение, которое, вероятно, быстрее, чем обход DOM.Сессия редактора имеет метод getAnnotations, который вы можете использовать.Каждая аннотация имеет тип, который показывает, являются ли они ошибкой или нет.
Вот как я устанавливаю свой обратный вызов для включения 'change'
function callback() {
var annotation_lists = window.aceEditor.getSession().getAnnotations();
var has_error = false;
// Unfortunately, you get back a list of lists. However, the first list is
// always length one (but not always index 0)
go_through:
for (var l in annotation_lists) {
for (var a in annotation_lists[l]) {
var annotation = annotation_lists[l][a];
console.log(annotation.type);
if (annotation.type === "error") {
has_error = true;
break go_through;
}
}
}
if (!has_error) {
try {
eval(yourCodeFromTextBox);
prevCode = yourCodeFromTextBox;
}
catch (error) {
eval(prevCode);
}
}
}
Насколько я знаю, тамдва других типа для аннотаций: «предупреждение» и «информация», на всякий случай, если вы хотите проверить их также.
Я отслеживал предыдущий код, который работал в глобальном (ну,выходит за рамки функции обратного вызова), потому что часто бывают ошибки в коде, но не в списке аннотаций.В этом случае при вычислении ошибочного кода это будет код, а вместо этого - старый код.
Хотя кажется, что два пробоя будут медленнее, мне кажется, что производительность не так уж и плохадо настоящего времени.