我在我的页面上使用ACE Editor作为我的文本编辑器,用户将输入代码。
我希望执行用户在浏览器上或浏览器中输入的代码。如何从编辑器获取输入并使用Browsers V8 JavaScript编译器?
然后我将尝试在Node.js上运行它,但首先我必须学习Node:)。
答案 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来解决循环问题。