我正在尝试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将显示所有脚本都已删除。但是,setTimeout
,setInterval
,绑定特定操作,点击事件等代码中存在一些内容,即使代码执行后它们仍然有效。
有没有办法在脚本执行后完全删除所有这些?
答案 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 +'';
但是这个解决方案有一些可能的内存泄漏。