0

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

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

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

与 jQuery 相同

foo();

$('script').remove();

foo();​

还有一个附带的问题:如果他们不以这种方式被移除,会怎样?

4

4 回答 4

4

它们运行是因为它们在第一次解析脚本时被加载到内存中。

您可以设置任何内容undefined来禁用它。

于 2012-04-30T12:36:58.933 回答
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>
于 2012-04-30T12:38:12.580 回答
1

你可以试试这个:

$('script:not([src], [type])', document).remove();
window.foo = false; // or, window.foo = undefined;
于 2012-04-30T13:18:03.310 回答
0

标签只定义了运行的<script>代码——例如

foo = function() { alert("Yay!"); };

将上面的函数分配给window.foo. 我想不出一种万无一失的方法(除了疯狂的事务内存实现,可能)来扭转任何给定代码块的影响。(我有直觉认为这个问题有一个名字。)

当然,如果您只想要一个有限的实现,您可以在运行window之前和之后记录密钥,然后在需要时记录在该运行期间创建的密钥。但同样——不是防弹的。<script>delete

于 2012-04-30T12:39:01.850 回答