对于用户脚本,我需要清除一个页面,包括其所有样式、内容、事件和计时器。是否可以在不重定向到的情况下做到这一点about:blank
?
我试过document.body.remove(); document.head.remove();
了,但定时器没有被禁用。
如何正确清除 HTML 页面?
对于用户脚本,我需要清除一个页面,包括其所有样式、内容、事件和计时器。是否可以在不重定向到的情况下做到这一点about:blank
?
我试过document.body.remove(); document.head.remove();
了,但定时器没有被禁用。
如何正确清除 HTML 页面?
要删除计时器,您可以请求一个空的 setTimeout,然后尝试减少其 id 并为每个 id 调用 clearTimeout。你可以对 setInterval 做同样的事情。
*编辑:正如bikeshedder 所说,超时ID 的类型未在MDN 中定义。它可以是从随机数到 UUID 的任何东西。MSDN 将其定义为 Integer,但并未说 ID 需要随着时间变大。很有可能重用已停止超时/间隔的 ID。依靠它是不可移植的,将来可能会中断。
但同时,上述方法是您清除所有计时器的唯一可能方法。至少它仍然适用于AFAIK。
如果可以的话,我个人建议保留所有 setTimeout 和 setInterval 的 ID。
绝对确定只需将浏览器重定向到不同的 URL:
window.location = "empty.html";
我宁愿不使用about:blank
它,因为它可能并非在所有浏览器中都可用,并且由于同源策略,您失去了对 iframe 或窗口内容的控制。此外about:blank
可能并非在所有浏览器中都可用。
无需将浏览器重定向到不同页面的唯一可靠方法是使用显式跟踪。您的代码需要使用特殊功能来启动/停止计时器、注册事件等。这很乏味,我认为这不是很实用,因为您需要破解您正在使用的所有库。
Monkeypatching 的内置功能window
也是一个很大的禁忌,因为某些浏览器可能不允许这样做。
您可以重定向到"data:text/html,"
. 这允许您指定要在 URL 中呈现的 HTML 文档。
IE9 is the first version of Internet Explorer to support the Data URL for iframes and windows.
Reference: Data URI scheme#Web browser support on Wikipedia.