Javascript 让浏览器找到源代码并重新编译用于实时编辑的脚本

Javascript 让浏览器找到源代码并重新编译用于实时编辑的脚本,javascript,google-chrome,internet-explorer,firefox,Javascript,Google Chrome,Internet Explorer,Firefox,在不涉及特定于浏览器的扩展或特定于浏览器的调试协议的情况下,如何仅从客户端代码触发脚本寻源和重新编译 我说的是实时编辑,对对象原型的更改会影响已创建的实例。我发现的唯一一件事是告诉您的Web服务器发送一个值为5秒的刷新参数。 但是我还没有时间测试这个问题。为什么不将文本存储在变量中,然后eval()在其上?使用Iframe 在javascript(主站点,而不是iframe)中,您可以重写进入iframe的html,然后附加iframe或只调用iframes contentwindow的.ope

在不涉及特定于浏览器的扩展或特定于浏览器的调试协议的情况下,如何仅从客户端代码触发脚本寻源和重新编译


我说的是实时编辑,对对象原型的更改会影响已创建的实例。

我发现的唯一一件事是告诉您的Web服务器发送一个值为5秒的刷新参数。

但是我还没有时间测试这个问题。

为什么不将文本存储在变量中,然后
eval()
在其上?

使用Iframe

在javascript(主站点,而不是iframe)中,您可以重写进入iframe的html,然后附加iframe或只调用iframes contentwindow的.open-.write-.close方法。(我没有这方面的presice代码,但你可以在网上找到它…)

我试着做这样的事情,但至少有一个问题需要解决:


我知道你的代码包含一个循环,至少在chrome浏览器中是如此!(也是主站点)

如果我正确理解了问题,您需要检测某些代码何时更改,并将其呈现在您的页面上

如果您想检测外部代码文件何时更改并在应用程序上使用它,您可以使用HTML5轮询甚至WebSocket

主要问题在于JavaScript,因为它需要由浏览器执行

对于代码执行,我个人不喜欢
eval()
,您是否考虑过在头部或身体上附加脚本? 代码很容易理解:

var s = document.createElement("script");
s.type = "text/javascript";
s.id = "codetoexecute";
s.innerHTML = thecode;
$("head").remove("#codetoexecute");

在下面的示例中,我使用一个简单的textarea来编写一些JavaScript。我还添加了一些变量来处理


请记住,这是一个非常糟糕的做法,因为您必须注意内存泄漏以及每个函数或变量的范围。建议使用全局访问的方法和属性,因为调试将很难进行。

您尝试过了吗?
livejs
只需执行
location.reload()
即可进行完整的重新编译(全局、DOM、原型等)我不知道,但是将旧代码设置为
null
,然后用类似requirejs的东西重新执行,至少可以给您带来您想要的一般效果。希望我有更好的东西给你,因为我肯定也会用的?没有好的方法可以做到这一点,因为脚本被加载到内存中,因此删除脚本标记并不能撤消脚本所做的操作,这意味着您必须手动清理所有内容,并重新运行整个代码以避免错误等,创建手动清理脚本可能完成的所有操作的东西是一项艰巨的任务,您必须检查每个属性,跟踪DOM更改、原型等。重新加载页面要比执行此操作容易得多,重新加载会为您提供一个干净的状态,不需要进行非常复杂的清理。缓存不是这里的问题,我说的是编辑并继续代码重新编译。等等,你想从外部编辑文件并重新获取它们吗?是的,我已经用调试协议进行了,如所见,但这只适用于chrome和opera。我自己也很想知道,我会做一些研究,然后再给你回复。我编写了一个CLI工具,通过chrome远程调试协议来实现这一点,但需要注意的是,您无法打开inspector,它将断开CLI工具的连接。简言之,这就像比较苹果和橙子Eval在执行新代码时效果很好,然而,对于实时编辑来说,它基本上是无用的,除非你创建一个专门让用户编辑单个功能的应用程序,这不是这里的目标。同样,这里没有真正满足要求,虽然它会有不重新加载的外观,但它基本上是重新加载。副作用会被执行,等等。然后我真的不明白你想要什么!你能再解释一下吗?我试着进行实时编辑,发现唯一的方法就是iframes。但是你不想要这种“假”的重新加载,那么你想要什么呢?不要重新加载;)基本上在编辑后继续。在大多数情况下,通过客户端的远程调试器是可行的,问题是有很多协议需要支持。比如,在我最初的研究之后,工具开始出现了。还有我的。我们这里讨论的是实时编辑,而不是文件更改时的页面重新加载,这基本上就是实时重新加载及其同类黑客。