为什么脚本在删除标签后仍然可以运行?
当我意外地为选择器键入“script”而不是“style”时,我正在测试jQuery以删除样式和链接标签以删除CSS样式。但是发生的事情是这些标签中定义的脚本仍在运行。那是为什么?
//assume foo is defined
foo();
var scripts = Array.prototype.slice.call(document.getElementsByTagName('script')),
current;
//remove all scripts
while (scripts.length) {
current = scripts.pop();
current.parentNode.removeChild(current);
}
//foo still works
foo();
foo();
$('script').remove();
foo();
还有一个侧面问题:如果他们不以这种方式被移除,会是什么?
答案 0 :(得分:4)
它们运行是因为在首次解析脚本时它们被加载到内存中。
您可以将任何内容设置为undefined
以禁用它。
答案 1 :(得分:1)
第一个脚本已经运行,第二个脚本已经加载,当你尝试删除它们时。它看起来像:
<script>
function foo(){
alert('foo');
}
</script>
<script type='text/javascript'>//<![CDATA[
foo();
var scripts = Array.prototype.slice.call(document.getElementsByTagName('script')),
current;
while (scripts.length) {
current = scripts.pop();
current.parentNode.removeChild(current);
}
foo();
//]]>
</script>
答案 2 :(得分:1)
你可以试试这个:
$('script:not([src], [type])', document).remove();
window.foo = false; // or, window.foo = undefined;
答案 3 :(得分:0)
<script>
标记只定义了运行的代码 - 例如
foo = function() { alert("Yay!"); };
将上述功能分配给window.foo
。我想不出一种防弹方式(除了疯狂的事务内存实现,偶然)来反转任何给定代码块的影响。 (我有直觉感觉这个问题有一个名字。)
当然,如果您只想要一个有限的实现,您可以在window
运行之前和之后的<script>
中记录密钥,然后在运行期间创建delete
个密钥。当你想要的时候。但是再次 - 不是防弹。