javascript - 确定 JavaScript 语法在 ACE 的更改处理程序中是否有效

标签 javascript ace-editor

我正在使用ACE用于交互式 JavaScript 编辑的编辑器。当我将编辑器设置为 JavaScript 模式时,ACE 会自动确定代码是否有效,并在无效时突出显示错误消息和行号。

change 事件处理程序期间,我想在尝试 eval() 之前检测 ACE 是否认为代码有效。我认为我可以做到这一点的唯一方法是:

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){}
});

但是:

  1. 依靠 UI 中某个元素是否存在特定类似乎非常脆弱,但更重要的是,
  2. 解析的视觉更新发生在 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 中,询问是否有错误?

最佳答案

当注释更改时,当前 session 会触发 onChangeAnnotation 事件。

之后,可以按如下方式检索新的一组注释

var annotations = editor.getSession().getAnnotations();

似乎可以解决问题。它返回一个 JSON 对象,其中作为,数组作为value 数组可能有多个对象,具体取决于每一行是否有多个注释。

结构如下(从firebug复制 - 用于我编写的测试脚本)

// annotations would look like
({

82:[
    {/*annotation*/
        row:82, 
        column:22, 
        text:"Use the array literal notation [].", 
        type:"warning", 
        lint:{/*raw output from jslint*/}
    }
],

rownumber : [ {anotation1}, {annotation2} ],

...

});

所以..

editor.getSession().on("changeAnnotation", function(){

    var annot = editor.getSession().getAnnotations();

    for (var key in annot){
        if (annot.hasOwnProperty(key))
            console.log("[" + annot[key][0].row + " , " + annot[key][0].column + "] - \t" + annot[key][0].text);
    }

});

// thanks http://stackoverflow.com/a/684692/1405348 for annot.hasOwnProperty(key) :)

当注释发生变化时,应该为您提供当前 Ace 编辑 session 中所有注释的列表!

希望这有帮助!

关于javascript - 确定 JavaScript 语法在 ACE 的更改处理程序中是否有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9506154/

相关文章:

javascript - 有没有办法使用 JavaScript 或 ajax 在浏览器中导入 SSL 证书?

javascript - 无法在 Typescript 中使用 bool 值 promise 作为 thenable 构造?

javascript - 设置文档就绪超时,如何设置

javascript - 如何使用requirejs从CDN加载ace编辑器主题?

javascript - 具有多种功能的 Lodash 过滤器

javascript - 在 for 语句中循环的对象内存储动态值数组

javascript - ace 编辑器不显示 <html>

ace-editor - 无法设置 ace 编辑器的语言模式

ace-editor - 在Ace Editor中是否有键盘启动保存的事件?

javascript - 如何在 Ace 编辑器上获取语法错误并发出警报