如何删除页面中的所有脚本,甚至是附加到事件和计时器的脚本?

时间:2011-05-18 16:39:41

标签: javascript

我正在尝试JavaScript&我似乎无法理解简单的行为。我想要做的是,绝对禁用以下代码片段之前的任何JS:

void (function(){
    (function prepare(name){ 
        var elements = document.getElementsByTagName(name);
        for(var i = elements.length; i--;)
            elements[i].parentNode.removeChild(elements[i]);
        return prepare;
    }('script'));
}());

注意Marcel Korpel :插入缩进以提高可读性,但您应将其粘贴为地址栏中的一行代码。

以下代码理论上应该禁用页面上的所有JS,对吧?要测试它,您可以在页面完全加载时通过javascript: [..]执行它。 FireBug HTML将显示所有脚本都已删除。但是,setTimeoutsetInterval,绑定特定操作,点击事件等代码中存在一些内容,即使代码执行后它们仍然有效。

有没有办法在脚本执行后完全删除所有这些?

2 个答案:

答案 0 :(得分:2)

不幸的是,超时(如setTimeout)和间隔(setInterval)是不透明的。这意味着没有办法取消运行超时/间隔,而不知道它的句柄。对于事件侦听器也是如此,DOM对象的事件接收器不可用,因此如果不知道如何调用removeEventListener,则无法addEventListener

我能想出的唯一方法是使用Opera中的用户javascript,您可以在其中挂钩上面列出的函数并跟踪超时/间隔/监听器。

答案 1 :(得分:1)

在脚本评估之后,您无法以这种方式删除JavaScript。如果您知道要删除的对象,可以使用强力方式:

for (var key in window) {
    window[key] = undefined;
}

但它不会删除事件。

事件很复杂,取决于所使用的事件系统类型...... 可以使用DOM上的递归迭代删除旧的DOM事件,并删除DOM元素上的任何类型的事件属性。

现代事件系统可以被禁用有点棘手:

document.body.innerHTML = document.body.innerHTML +'';

但是这个解决方案有一些可能的内存泄漏。