Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当jQuery.remove()用于删除脚本标记时,它是否会清除加载的javascript?_Javascript_Jquery - Fatal编程技术网

当jQuery.remove()用于删除脚本标记时,它是否会清除加载的javascript?

当jQuery.remove()用于删除脚本标记时,它是否会清除加载的javascript?,javascript,jquery,Javascript,Jquery,如标题所示,如果我使用以下命令从DOM中删除脚本标记: $('#scriptid').remove(); javascript本身是保留在内存中还是被清除 或者。。。我是否完全误解了浏览器对待javascript的方式?这是很有可能的 对于那些对我的提问原因感兴趣的人,请参见以下内容: 我正在将一些常见的javascript交互从静态脚本文件移动到PHP中动态生成的脚本文件中。在用户需要时按需加载 这样做的原因是为了移动逻辑服务器端并运行一个从服务器clientside返回的小脚本。clien

如标题所示,如果我使用以下命令从DOM中删除脚本标记:

$('#scriptid').remove();
javascript本身是保留在内存中还是被清除

或者。。。我是否完全误解了浏览器对待javascript的方式?这是很有可能的

对于那些对我的提问原因感兴趣的人,请参见以下内容:

我正在将一些常见的javascript交互从静态脚本文件移动到PHP中动态生成的脚本文件中。在用户需要时按需加载

这样做的原因是为了移动逻辑服务器端并运行一个从服务器clientside返回的小脚本。clientside没有包含大量逻辑的大型脚本

这与facebook的做法类似

以一个简单的对话框为例。我现在做的不是用javascript生成html,将其附加到dom,然后使用jqueryUI的对话框小部件加载它,而是

  • Ajax请求是向dialog.php发出的
  • 服务器生成特定于此对话框的html和javascript,然后将它们编码为JSON
  • JSON返回给客户端
  • HTML被附加到
    之后,一旦呈现出来,javascript也被附加到DOM中
javascript在插入时自动执行,并打开动态对话框

这样做大大减少了页面上javasript的数量,但我担心的是如何清理插入的javascript

显然,一旦关闭对话框,就会使用jQuery将其从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);