インタラクティブな JavaScript 編集にACEエディターを使用しています。エディターを 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 で、エラーがあるかどうかを尋ねるより良い方法はありますか?