【问题标题】:Completely clear a page through JS without redirecting to about:blank?通过JS彻底清空一个页面而不重定向到about:blank?
【发布时间】:2013-02-03 18:40:20
【问题描述】:

对于用户脚本,我需要清除一个页面,包括其所有样式、内容、事件和计时器。是否可以在不重定向到about:blank 的情况下做到这一点?

我试过document.body.remove(); document.head.remove();,但定时器没有被禁用。

如何正确清除 HTML 页面?

【问题讨论】:

  • 为什么不重定向?恐怕不能没有。您也许能够清除一些超时,但不是全部。挂起的 AJAX 调用也很难或不可能杀死。
  • 你好,@Ebrahim Byagowi 我还需要清除页面中的所有内容,并且一直认为重定向到 about:blank 是一个很好的解决方案。为什么你特别不想要那个?
  • 因为我想在结果页面上显示一些东西,而不仅仅是一个空页面。您的解决方案是否可以在 about:blank [通过用户脚本而不是扩展名] 上显示一些内容?

标签: javascript html dom greasemonkey userscripts


【解决方案1】:

绝对确定只需将浏览器重定向到不同的 URL:

window.location = "empty.html";

我宁愿不使用about:blank,因为它可能并非在所有浏览器中都可用,并且由于同源策略,您会失去对 iframe 或窗口内容的控制。此外,about:blank 可能并非在所有浏览器中都可用。


无需将浏览器重定向到不同页面的唯一可靠方法是使用显式跟踪。您的代码需要使用特殊功能来启动/停止计时器、注册事件等。这很乏味,而且我认为这不是很实用,因为您需要破解您正在使用的所有库。

window 的内置函数打补丁也是一个大问题,因为某些浏览器可能不允许这样做。

【讨论】:

  • 正确的想法;位置建议不太好。 empty.html 会受到超时延迟和 DNS 拦截的影响。您需要在受信任的服务器http://my_server.com/blank_page.htm 上的实际页面,或者至少在 jsBin、jsFiddle、pastebin 等上设置一些东西。
  • window.location = "empty.html" 重定向相对于当前域和路径。它确实重定向到"http://empty.html/",这确实是非常错误的。
  • 为了好玩,您可以使用"data:text/html,",它不需要任何额外的 GET 请求。但它在 IE
  • 否,window.location = "empty.html" 指向当前路径或默认域(取决于),并获得以下一项或多项:(a) 长时间超时,(b) 404,(c) DNS服务器拦截说“没有这样的域”。
【解决方案2】:

要删除计时器,您可以请求一个空的 setTimeout,然后尝试减少其 id 并为每个 id 调用 clearTimeout。你可以对 setInterval 做同样的事情。

*编辑:正如bikeshedder所说, MDN 中没有定义 timeoutID 的类型。它可以是从随机数到 UUID 的任何东西。 MSDN 将其定义为 Integer,但并未说 ID 需要随着时间变大。很有可能重用已停止超时/间隔的 ID。依赖它是不可移植的,将来可能会损坏。

但同时,上述方法是您清除所有计时器的唯一可能方法。至少它仍然适用于 AFAIK。

如果可以的话,我个人建议保留所有 setTimeout 和 setInterval 的 ID。

【讨论】:

  • MDN 中没有定义 timeoutID 的类型。它可以是从随机数到 UUID 的任何东西。 MSDN 将其定义为 Integer,但并未说 ID 需要随着时间的推移而变大。很有可能重用已停止超时/间隔的 ID。依靠它是不可移植的,将来可能会损坏。
  • @bikeshedder,当然。我将添加此信息以回答。但另一方面,这是唯一可能的方式。
  • 在我看来,这确实只是一种 hack,应该避免。
【解决方案3】:

您可以重定向到"data:text/html,"。这允许您指定要在 URL 中呈现的 HTML 文档。

IE9 是第一个支持 iframe 和窗口的数据 URL 的 Internet Explorer 版本。
参考:Data URI scheme#Web browser support 维基百科。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 2017-08-10
    • 2022-11-15
    • 2017-06-05
    • 2014-05-17
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    相关资源
    最近更新 更多