javascript - 阻止每个网站域解析所有或部分 DOM 内容

标签 javascript parsing dom dom-events ecmascript-2018

我创建了一个小的命令式 Vanilla JavaScript 脚本来阻止分散注意力的新闻网站,我觉得这是一种类似上瘾的行为:

// ==UserScript==
// @name         blocksite
// @match        *://*.news_site_1.com/*
// @match        *://*.news_site_2.com/*
// ==/UserScript==

function blocksite () {
    document.body.innerHTML =`<div dir="ltr"; style="font-size:100px; font-weight: bold; text-align: center">Blocked !</div>`;
}

setTimeout( blocksite(), 1000)
setTimeout( blocksite(), 5000) // Block possible later DOM mutations;
setTimeout( blocksite(), 10000) // Block possible later DOM mutations;

该脚本基本上可以工作(弹出窗口接管 DOM),但我的问题是它只在所有 DOM 内容都被解析和呈现后才阻止站点,而我有兴趣阻止解析。

一边听load事件来不及了,听早点DOMContentLoaded事件可能比收听 load 有更好的结果或收听setTimeout() ,因为在解析内容而不是渲染后可能会立即发生阻塞。
然而,我需要一种方法来完全阻止解析相关网站的任何网页(或者,在解析第一个 DOM HTML 元素节点后阻止任何进一步的解析)。

我试过的

根据评论,我在 Google Chrome 中尝试过:
window.stop();我不记得有任何重大变化window.close();它仅从 devtool 控制台对我有用window.location.replace("about:blank");仅在 load 之后才对我有用事件在解析开始时完成

我的问题

我需要的操作是否可以使用最新的 ECMAScript (10) 进行,如果可以,应该使用什么命令?

Sxribe 更新:

亲爱的 Sxribe,我使用以下代码创建了以下文件。
该文件确实由 Tampermonkey 加载(带有正确的 @match 列表),但我在加载匹配的网站时没有看到浏览器的变化(这些网站没有被阻止并正常加载)。

文件中的代码
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>

<h1>This is a Heading</h1>
<p>This is a paragraph.</p>

</body>
</html>

Tampermonkey 中的文件调用
window.open("C:\Users\MY_USER_NAME\Desktop\blocksite.html");

最佳答案

要中止加载网站,您可以简单地使用 window.stop() 方法。

调用时,当当前脚本运行完毕后,网站的解析完全停止。

例如:

<p>Before scripts</p>
<script>
  document.write('<p>Before stop</p>')
  console.log('Before stop')

  window.stop()

  document.write('<p>After stop</p>')
  console.log('After stop')
</script>
<p>Between scripts</p>
<script>
  console.log('Second script')
  document.write('<p>Second script</p>')
</script>
<p>After scripts</p>

上面的 HTML 显示:

Before scripts
Before stop

虽然您可以在控制台中看到以下内容:

Before stop
After stop

这表明 <script>调用.stop()已全面评估,但在 .stop() 之后对 DOM 进行了更改不显示。

或者,要删除完整的 DOM 内容,最好重定向浏览器,该解决方案即使在页面加载后也有效:

window.open('about:blank','_self')

关于javascript - 阻止每个网站域解析所有或部分 DOM 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58701050/

相关文章:

javascript - 在 mousemove 上使用 JavaScript 应用转换不会即时更新

javascript - 展开/折叠摘录和内容

JavaScript 导航菜单多次点击

javascript - 使用jawr编译脚本时如何在开发者工具中调试?

java - 解析 JsonObject 时出现问题 - 错误 'String cannot be converted to JSONObject'

php - 使用 Simple HTML DOM Parser 按 ID 查找表

java - 更改 liferay 门户中的 Logo

javascript - 在 HTML5 Canvas 上绘制图像

java - 字符串中 JSON 控制字符的转义

javascript - 检测指令是否从 DOM 中移除