当jQuery.remove()用于删除脚本标记时,它是否会清除加载的javascript?
如标题所示,如果我使用以下命令从DOM中删除脚本标记:当jQuery.remove()用于删除脚本标记时,它是否会清除加载的javascript?,javascript,jquery,Javascript,Jquery,如标题所示,如果我使用以下命令从DOM中删除脚本标记: $('#scriptid').remove(); javascript本身是保留在内存中还是被清除 或者。。。我是否完全误解了浏览器对待javascript的方式?这是很有可能的 对于那些对我的提问原因感兴趣的人,请参见以下内容: 我正在将一些常见的javascript交互从静态脚本文件移动到PHP中动态生成的脚本文件中。在用户需要时按需加载 这样做的原因是为了移动逻辑服务器端并运行一个从服务器clientside返回的小脚本。clien
$('#scriptid').remove();
javascript本身是保留在内存中还是被清除
或者。。。我是否完全误解了浏览器对待javascript的方式?这是很有可能的
对于那些对我的提问原因感兴趣的人,请参见以下内容:
我正在将一些常见的javascript交互从静态脚本文件移动到PHP中动态生成的脚本文件中。在用户需要时按需加载
这样做的原因是为了移动逻辑服务器端并运行一个从服务器clientside返回的小脚本。clientside没有包含大量逻辑的大型脚本
这与facebook的做法类似
以一个简单的对话框为例。我现在做的不是用javascript生成html,将其附加到dom,然后使用jqueryUI的对话框小部件加载它,而是
- Ajax请求是向dialog.php发出的
- 服务器生成特定于此对话框的html和javascript,然后将它们编码为JSON
- JSON返回给客户端
- HTML被附加到
之后,一旦呈现出来,javascript也被附加到DOM中
$(“#对话框”).remove()代码>
javascript附加了一个ID,我还通过相同的方法将其从DOM中删除
但是,如上所述,使用jQuery的.remove()实际上是从内存中清除javascript,还是从DOM中简单地删除
元素
如果是这样的话,有什么办法来清理这个问题吗?没有。一旦加载了脚本,它定义的对象和函数就会保存在内存中。删除脚本元素不会删除它定义的对象。这与CSS文件不同,在CSS文件中删除元素会删除它定义的样式。这是因为新款式很容易回流。你能想象一下,计算出一个脚本标记创建了什么以及如何删除它会有多困难吗
编辑:但是,如果您有一个定义了myFunction
的文件,那么您将另一个重新定义myFunction
的脚本添加到其他文件中,新值将保留。如果您想保持DOM干净,可以删除旧的脚本标记,但删除它就是这么做的
EDIT2:我能想到的唯一真正“清理”函数的方法是有一个JS文件,它基本上调用delete window.myFunction
,用于其他脚本文件可能定义的每个可能的对象和函数。出于显而易见的原因,这是一个非常糟糕的主意。如果您的脚本已经执行了删除DOM元素,则不会删除它们。转到使用JavaScript的任何页面,打开首选JavaScript控制台并键入$(“script”).remove()。一切都在继续
这说明@Kolink的答案:
HTML:
功能测试(n){
$output=$(“#output”)
$output.append(“测试”+n+“
”)
}
试验(1);
Javascript:
$("script").remove();
// or $("#yourDynamicGeneratedScript").remove();
test(2);
test(3);
test(4);
function test(n) {
$output = $("#output")
$output.append("REDEFINED! " + n + "<br/>")
}
test(5);
test(6);
test(7);
$(“脚本”).remove();
//或$(“#yourDynamicGeneratedScript”).remove();
试验(2);
试验(3);
试验(4);
功能测试(n){
$output=$(“#output”)
$output.append(“重定义!”+n+“
”)
}
试验(5);
试验(6);
试验(7);
事实上,不幸的是,我认为情况会是这样。你能想出解决这个问题的办法吗?或者,对于上面给出的情况,最好增加对话框的id,并让动态javascript镜像该元素id?从而确保没有任何潜在的重复引用?或者你觉得整个方法需要重新思考吗?谢谢Kolink-我刚刚看过你的编辑。因此,为了澄清,如果我在新创建的dialog元素上再次使用jQueryUI的$('#dialog').dialog()小部件,使用明显不同的javascript。。。它会取代旧的吗?如果是这样,这是完美的。删除是个坏主意的明显原因是什么?此外,垃圾收集器不会处理没有引用它们的对象吗?似乎会有人利用垃圾收集器进行攻击。注意:向js文件添加querystring(日期时间戳)将重新加载该文件。MyFile.js+'?v='+MyStamp。如果您正在加载具有相同函数名的其他文件,那么这种方法非常有效。如果您关心创建对话框所需的JS数量,可以查看EJS。这将允许您从JS创建HTML模板。感谢westo,我使用JsRender进行客户端模板制作。然而,我上面提到的方法不仅适用于对话框,还适用于模板不适用的许多其他交互。也许对话示例不是一个好的示例。谢谢tomasmuller。这个例子很受欢迎。:)根据具体情况,也许另一种方法是将系统构建为单页应用程序,例如使用Backbone.js。退房
$("script").remove();
// or $("#yourDynamicGeneratedScript").remove();
test(2);
test(3);
test(4);
function test(n) {
$output = $("#output")
$output.append("REDEFINED! " + n + "<br/>")
}
test(5);
test(6);
test(7);