如何执行用户在我的页面上输入ACE编辑器的代码

时间:2014-03-27 21:39:40

标签: javascript ace-editor

我在我的页面上使用ACE Editor作为我的文本编辑器,用户将输入代码。

  1. 我希望执行用户在浏览器上或浏览器中输入的代码。如何从编辑器获取输入并使用Browsers V8 JavaScript编译器?

  2. 然后我将尝试在Node.js上运行它,但首先我必须学习Node:)。

2 个答案:

答案 0 :(得分:14)

使用JavaScript抓取一些用户输入的代码并运行它相对简单。从本质上讲,您将从ACE获取代码:

var code = editor.getValue();

然后使用javascript运行它。在最简单的层面上你可以做到:

eval(code);

但是,你probably don't want to use eval()。相反,你可能会做类似的事情:

// grabbed from https://stackoverflow.com/questions/6432984/adding-script-element-to-the-dom-and-have-the-javascript-run
var script = document.createElement('script');
try {
  script.appendChild(document.createTextNode(code));
  document.body.appendChild(script);
} catch (e) {
  script.text = code;
  document.body.appendChild(script);
}

这会奏效。但是,它仍然会导致一些问题,因为用户代码可能会影响您的环境。在这种情况下,从安全角度来看可能并不可怕(除非用户可以共享他们的代码),但这会让人感到困惑。因此,您需要sandbox your code

This answer explains sandboxing client side javascript,使用window.postMessage,您可以将javascript发送到沙盒iframe并在那里进行评估。

如果您希望使用此服务器端并执行节点代码,则需要以不同方式执行沙盒操作。 在服务器上,沙盒是一个更令人担忧的问题,因为用户可以使用Javascript做更多事情并且可能恶意地与您的服务器进行交互。幸运的是,有a few sandboxes for Node that should help

答案 1 :(得分:0)

获取代码只是code = editor.getValue()的简单部分 简单地使用V8编译器也很容易,创建iframe并执行

try {
    var result = iframeWindow.eval(code)
} catch(e) {
    // report error...
}

但这不会非常有用,因为创建无限循环并打破页面非常容易 您可以查看https://github.com/jsbin/jsbin/blob/master/public/js/runner/loop-protect.js#L7来解决循环问题。