我正在使用ACE编辑器进行交互式 JavaScript 编辑。当我将编辑器设置为 JavaScript 模式时,ACE 会自动确定代码是否有效,如果不是,则会突出显示错误消息和行号。
在change
事件处理程序期间,我想在我尝试之前检测 ACE 是否认为代码有效eval()
。我认为我可能会这样做的唯一方法是:
var jsMode = require("ace/mode/javascript").Mode;
var editor = ace.edit('mycode'), edEl = document.querySelector('#mycode');
editor.getSession().setMode(new jsMode);
editor.getSession().on('change',function(){
// bail out if ACE thinks there's an error
if (edEl.querySelector('div.ace_gutter-cell.ace_error')) return;
try{
eval(editor.getSession().getValue());
}catch(e){}
});
然而:
- 依靠 UI 中具有特定类的元素的存在似乎非常脆弱,但更重要的是,
- 解析的视觉更新发生在
change
回调发生之后。
因此,我实际上必须等待超过 500 毫秒(JavaScript 工作者启动之前的延迟):
editor.getSession().on('change',function(){
setTimeout(function(){
// bail out if ACE thinks there's an error
if (edEl.querySelector('div.ace_gutter-cell.ace_error')) return;
try{
eval(editor.getSession().getValue());
}catch(e){}
},550); // Must be longer than timeout delay in javascript_worker.js
});
有没有更好的方法,在 JS 模式的未记录 API 中,询问是否有任何错误?