当前位置: 首页 > 知识库问答 >
问题:

即时替换Javascript

侯池暝
2023-03-14

这个问题在互联网上一次又一次地出现(即使是在SO上),但我还没有找到一个令人满意的解决方法:

如何在运行的web应用程序中更改/替换Javascript代码,而不重新加载页面?

很多人对此的回答是“你不能,因为这是不可能的”。IntelliJ IDEAs live edit插件的一些实验证明了这是可能的。但我不想为这个特性绑定到IDE。(加分:与浏览器无关)

下面是我尝试的:

  1. 将//#sourceURL=whatery.js添加到动态加载的脚本
  2. 将包含Whatever.js的文件夹添加到Chrome中
  3. 将本地whatever.js映射到网络whatever.js
  4. 在任何一个中更改代码都不会影响网页。事实上,编辑网络端文件会导致开发工具奇怪的“闪烁”。

请理解,我并不期望一旦我更改了它,更改后的JS就会神奇地应用到网页上,而是期望它在执行点再次通过时使用新的代码。

示例:

  1. 已给出触发“报警(1)”的按钮
  2. 更改为“警报(2);”
  3. 我希望该按钮触发“报警(2);”

由于有许多依赖项和在工作流中很晚才触发的巨大脚本,刷新页面对我来说真的是一个大问题,所以我需要找到一个即时工作的解决方案。

共有2个答案

齐高寒
2023-03-14

备选方案1:肝硬变

我会说,只要是出于开发原因,您就可以在服务器上使用livereload。

取决于您的服务器类型。我是apach、glassfish和其他Java世界的大专家,但在js(nodejs)世界中,这是一个更短的方法。

(npm-livereload链接)

Hack:您可以使用内置LivereLoad的简单Node.js服务器处理静态文件,如js、css。

备选方案2:jRebel

我不确定js,但也许JRebel可以处理这个问题。无论如何,这对开发过程是一个很好的补充--至少它会成为Java的“热重装:为你”。

备选方案3:猴子补丁

您可以使用monkey-patching技术:js中的每个函数它只是一个字符串,您可以使用new function()来转换string->function

就像:

var foo = {
  sum: function (a, b) {return a+b;}
}

//...

obj.sum = new Function(....) //Now you're replaced the original code

查看这篇关于做猴子修补的优美方法的文章。

还有我的小广告:monkey-punch

选项4:附加新标签

您可以通过以下方式附加js文件:

var s = document.createElement("script");
s.type = "text/javascript";
s.src = "http://somedomain.com/somescript";
$("head").append(s);

您还可以在任何时候删除dom元素(脚本、样式)并附加新的元素。

家弘业
2023-03-14

首先:您所要求的是非常棘手的,如果您在应用程序中允许这样做,您就会发现安全问题,无论如何,这并不是不可能的。

但如果您想实现您的示例,请执行以下步骤:

制作一个代码段,如下所示:

var message = "1";   // this must be a global variable!!!!

function showMessage() {
    alert(message);
}

给定一个触发“报警(1)”的按钮;

Make按钮调用函数I:onclick='show message()'

更改为“alert(2);”我希望按钮会触发'alert(2);‘

现在很简单,当您检测到暗示将警报消息更改为2的事件时,您只需更改message值:

message = "2";

仅此而已。

 类似资料:
  • 我们正在尝试构建基本的事件日历功能,该功能允许用户创建事件并指定给定月、日、年、小时和分钟的开始时间以及时区()。CMS系统根据服务器的位置生成结果,比方说山区标准时间。CMS没有在其日期选择器组件中提供指定时区的选项。但是,我们可以控制SQL datetime精度,默认设置为。 被格式化为,以便在.ics/ical中填充开始/结束时间。使用这种格式,它会使2018年5月25日7:00PM()始终

  • 问题内容: 他们两个几乎都做同样的事情。确定该方法很热,然后编译而不是解释。使用OSR,您只需在编译后立即转到编译版本,而不像JIT,后者是在第二次调用该方法时调用已编译的代码。 除此之外,还有其他区别吗? 问题答案: 通常, 即时 编译是指在运行时编译本机代码并执行它,而不是(或除了)进行解释。某些虚拟机(例如Google V8)甚至都没有解释器;这些虚拟机甚至没有解释器。他们通过JIT编译执行

  • 问题内容: 他们两个几乎都做同一件事。确定该方法很热,然后编译而不是解释。使用OSR,您只需在编译后立即转到编译版本,而不像JIT,后者是在第二次调用该方法时调用已编译的代码。 除此之外,还有其他区别吗? 问题答案: 通常,即时编译是指在运行时编译本机代码并执行它,而不是(或除了)进行解释。某些虚拟机(例如Google V8)甚至都没有解释器;这些虚拟机甚至没有解释器。他们通过JIT编译执行的每个

  • 我有以下代码: CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){ 这就是我试图在xml文件中替换的内容: 这是怎么回事?无论如何要更新ID吗? 新堆栈跟踪:

  • 我计划根据以下逻辑将ZonedDateTime转换为即时。 比如说,我在太平洋标准时间时区,当前时间是11A。M、 如果我现在转换(截至今天2018年3月4日没有夏令时),toInstant将为7P。M 由于实行夏时制,toInstant将于2018年4月4日上午11点返回。 因此,下面的代码正确返回。 但是, 如果我转换为Instant,然后添加一个月,结果会有所不同。 这是确定的,因为我们已经

  • 本文向大家介绍JS替换字符串中字符即替换全部而不是第一个,包括了JS替换字符串中字符即替换全部而不是第一个的使用技巧和注意事项,需要的朋友参考一下 有时候用JS替换字符串时,replyText= replyText.replace("aa",""); 这样只能替换掉字符串中第一个aa,有时候需要替换全部的aa,这种方法就不能使用了。。 可以用如下方法做参考: str是目标字符串 reallyDo是