脚本元素删除后脚本仍然运行

时间:2012-04-30 12:34:54

标签: javascript jquery

为什么脚本在删除标签后仍然可以运行?

当我意外地为选择器键入“script”而不是“style”时,我正在测试jQuery以删除样式和链接标签以删除CSS样式。但是发生的事情是这些标签中定义的脚本仍在运行。那是为什么?

here's a sample in JS

//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();​

same thing with jQuery

foo();

$('script').remove();

foo();​

还有一个侧面问题:如果他们不以这种方式被移除,会是什么?

4 个答案:

答案 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个密钥。当你想要的时候。但是再次 - 不是防弹。