【发布时间】:2020-02-11 20:13:02
【问题描述】:
我有一个有很多弹出窗口的网站,每当用户加载弹出窗口(通过 ajax)时,弹出窗口中也会加载一个 JavaScript 代码,我希望在删除它的弹出窗口时删除这个 JavaScript 代码。
主站代码:
<body>
...
<div id="popup" style="display:none">
</div>
...
</body>
然后是js文件中的加载器:
$.ajax('url',{
success:function(data){
$("#popup").show().html(data);
};
});
ajax 调用的视图之一并将其推送到弹出窗口中:
some html codes
<script>
$(document).on('click',function(){
console.log("document click");
});
</script>
当用户关闭弹出窗口时,我使用此代码清空弹出窗口:
$("#popup").hide().html("");
但这并没有结束加载的on click事件,视图中的任何函数都将仍然存在于内存中并且可以被调用!
这是一个问题,因为我这里有很多弹出窗口,并且 JavaScript 会在一段时间后占用内存,所以我需要在使用网站一段时间后刷新浏览器,而且每次重新加载弹出窗口时都会重复事件!
如果无法从内存中清除这些JS,有什么解决方法吗?
【问题讨论】:
-
$(document).off('click');?? - (api.jquery.com/off),对于通过ajax加载的脚本,给它一个id并在脚本元素上使用.remove(),但您仍然需要删除event handlers -
这能回答你的问题吗? Best way to remove an event handler in jQuery? 连同这个用于删除脚本 (stackoverflow.com/questions/30072887/…)
-
@RyanWilson 感谢您的参考,但不,它不能回答问题。你看,问题不仅在于事件,还在于 ajax 请求附带的所有内容,我不希望函数在弹出窗口关闭或事件后保留
-
正如我所说,在我给你的第二个链接中,给
script和id并删除它,因此functions -
我显然误解了您要完成的工作,简短的回答是,如果不刷新页面或导致回发,就无法从内存中删除动态脚本加载的函数,但是您可以由于缺少更好的词
"destroy"通过将事物设置为undefined等等,动态脚本中的所有内容,这必须通过您在删除部分视图时调用的清理或卸载函数来完成,也许是已接受的回答这篇文章 (stackoverflow.com/questions/34997399/…) 会让你继续前进。
标签: javascript jquery garbage-collection