在页面显示到屏幕之前删除 DOM 元素(在 Chrome 扩展中)

2024-04-24

我正在尝试创建一个扩展,该扩展将在页面显示到屏幕上之前删除某些页面元素(按 id 或类)。我尝试在文档上使用事件侦听器,以“DOMContentLoaded”作为事件,但 javascript 似乎在页面显示给用户后执行,然后删除它,所以它不像我想要的那么顺利(不显示不需要的内容根本)

document.addEventListener("DOMContentLoaded", function() {

var elements = document.getElementsByClassName("header-nav-item");
while(elements.length > 0){
    elements[0].parentNode.removeChild(elements[0]);
}

var element = document.getElementById("topchapter");
element.parentNode.removeChild(element);
element = document.getElementById("wrapper_header");
    element.parentNode.removeChild(element);

});

这是我的扩展使用的内容脚本,该脚本在页面加载后删除。在用户看到页面之前,我需要使用什么来修改 DOM?


Use 变异观察者 https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver在注入的内容脚本中document_start在页面加载期间在渲染 HTML 元素之前从 DOM 中实际删除它们,这样就不会出现闪烁。

  • 清单.json:
{
  "name": "Delete elements",
  "version": "1.0",
  "content_scripts": [
    {
      "matches": ["*://somesite.com/*"],
      "run_at": "document_start",
      "all_frames": true,
      "js": ["content.js"]
    }
  ],
  "manifest_version": 2
}
  • 内容.js:
const DEL_SELECTOR = '.header-nav-item, #topchapter, #wrapper_header';

const mo = new MutationObserver(onMutation);
// in case the content script was injected after the page is partially loaded
onMutation([{addedNodes: [document.documentElement]}]);
observe();

function onMutation(mutations) {
  let stopped;
  for (const {addedNodes} of mutations) {
    for (const n of addedNodes) {
      if (n.tagName) {
        if (n.matches(DEL_SELECTOR)) {
          stopped = true;
          mo.disconnect();
          n.remove();
        } else if (n.firstElementChild && n.querySelector(DEL_SELECTOR)) {
          stopped = true;
          mo.disconnect();
          for (const el of n.querySelectorAll(DEL_SELECTOR)) el.remove();
        }
      }
    }
  }
  if (stopped) observe();
}

function observe() {
  mo.observe(document, {
    subtree: true,
    childList: true,
  });
}

Notes:

  • 观察者回调必须简单且快速,以免在页面加载期间引入滞后,因此请使用简单的选择器和直接 DOM 访问而不是 jQuery。
  • 工作完成后,最好立即断开观察者的连接,这样就不会不必要地观察页面的其余部分。
  • 不要添加多个观察者,将所有检查合并到一个观察者中
  • mutations数组还包含文本子节点 https://developer.mozilla.org/en-US/docs/Web/API/Text以及添加的元素本身。这就是为什么我们确保tagName存在 - 这意味着该节点是一个元素。
  • 每个突变的addedNodes数组通常具有容器元素,例如DIV例如,其中可能有一个我们想要删除的元素。所以我们必须检查它querySelector or querySelectorAll.
  • childNode.remove() https://developer.mozilla.org/en-US/docs/Web/API/ChildNode/remove自 Chrome 23 起可用
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在页面显示到屏幕之前删除 DOM 元素(在 Chrome 扩展中) 的相关文章

  • setInterval() 如何影响性能?

    我们正在使用 Twitter Bootstrap 作为框架构建一个 Web 应用程序 但在显示 隐藏工具提示时遇到问题 除了尝试找到实际问题的解决方案之外 我还有一个关于我们同时使用的解决方法的问题 从性能角度来看 使用 setInterv
  • Heroku 上重启后 Better-SQLite3 数据库重置

    我有一个 Discord 机器人better sqlite3 https github com JoshuaWise better sqlite3硬币和 XP 数据库 直到两周前它一直工作得很好 现在 每次重新启动后 它只会恢复 XP 和硬
  • 使用 Bluebird.js 和 Twitter 流的 Promise 和流

    我对 Promises 和 Node 非常陌生 并且对在流中使用 Promise 感到好奇 我可以承诺直播吗 使用 Bluebirdjs 和 Twit 模块 我有以下内容 var Twit require twit var Promise
  • 从 Eclipse 导出后,WAR 文件中缺少一些必要的库 - 为什么?

    我接手了一个大学的项目 其中包含一些 Web 服务 通过将项目导出为 WAR 文件 一些库包含在文件中 例如 Axis2 而另一些则不包含 hibernate JDBC 驱动程序 另外 添加到类路径中的 jar 尚未导出 所有库都位于硬盘驱
  • 始终滚动 div 元素而不是页面本身

    我有一个带有内部的页面布局 div 包含页面上重要内容的元素 设计的重要部分是 content height 300px width 500px overflow scroll 现在 当包含的文本大于 300px 时 我需要能够滚动它 是否
  • 移动浏览器上的 Javascript / jQuery 页面更改事件

    我正在设计一个移动网站 同时考虑所有领先的浏览器 Safari Chrome Dolphin Opera 我想显示一个 正在加载 元素页面导航 更改 请求新页面 我无法在锚标签上使用点击事件 因为有很多锚标签存在preventDefault
  • JavaScript 中的可选参数

    如果缺少剩余参数 为什么该函数不会抛出错误 showStatistics Mark Teixeira New York Yankees 1st Base 这是定义的函数 function showStatistics name team p
  • 如何使用 CSS 或 javascript 创建圆角

    复制 使用 CSS 创建圆角的最佳方法是什么 https stackoverflow com questions 7089 what is the best way to create rounded corners using css 7
  • ELEMENT.style.color 在 IE 中不起作用

    在一个小型 Web 应用程序中 我使用 JavaScript 在文本框中设置一些文本及其颜色 在下面的片段中 el 是我的对象 这段代码在 Firefox Opera 和 Safari 下产生了正确的效果 但在 IE 下却没有这样的运气 我
  • 传单圆圈绘制/编辑问题

    我第一次制作传单 并面临绘制圆圈和编辑 更改圆圈位置 的问题 我面临的问题是 编辑 移动 圆从一个位置到另一位置会改变其半径 Note 请尝试在给定的小提琴中在地图顶部创建圆圈 然后通过单击编辑按钮将其移动到底部 如果我在地图的顶部创建圆圈
  • 如何在 .js 中的字符串中插入来自 ruby​​ 示例的变量[重复]

    这个问题在这里已经有答案了 在 ruby 中 您可以将变量插入到字符串中 如下所示 x sake puts I like x I like sake 例如 def what i like word I like word end 在 jav
  • 可拖动的非模态弹出窗口 Jquery Mobile

    我希望在 Jquery mobile 中有一个弹出窗口 它不会阻止用户与页面交互 并且 data dismissible false 即当页面的另一部分与页面的另一部分交互并保持可见时 弹出窗口不会消失 我已经尝试过这个 popupNew
  • 角度引导手风琴数据绑定问题

    我有 2 个相同型号的下拉菜单 一个位于手风琴内部 另一个位于外部 外部下拉菜单在 2 路数据绑定方面工作良好 但手风琴内部的下拉菜单似乎只有 1 路绑定 换句话说 在 UI 中选择并不会设置模型值 我找到了一个建议here https s
  • ExpressJS - 提供通用 Nuxt 应用程序和 AngularJS SPA

    我有一个具有以下结构的博客项目 服务器 用 Node Express 编写 管理员 AngularJS SPA public AngularJS SPA 目前 管理部分和公共部分具有相同的域 但管理部分使用不同的子域 这允许我在 Expre
  • 单击文件下载后,成功后使用 AJAX 重定向到另一个页面

    In my WordPress project my Download button containing a zip file which onClick should be downloaded So the HTML producin
  • JQuery 验证不起作用

    我有一种表单 其中一个输入类型的值为 名字 但这可以在 onfocus 函数上更改我想验证此输入字段 如果它为空白或 名字 我有两个 jQuery 文件jquery 1 4 2 min js jquery validate pack js
  • 在 Chrome 扩展中创建隐藏的 iframe

    是否可以在 google chrome 扩展中的 background html 页面上创建一个 iframe 并让它向网站发出请求 我不确定该扩展程序到底是如何工作的 chrome 会自动忽略所有显示标签还是会以不可见的方式运行它 它会正
  • 如何使用 jQuery 以编程方式单击 Gmail 中的“显示下面的图像”?

    我正在创建一个 Google Chrome 扩展程序 它使用 jQuery 在 Gmail 中添加了 显示下面的图像 链接的键盘快捷键 我尝试了以下方法来模拟点击 但未成功 canvas frame contents find span c
  • 用于检查字符串是否至少包含 3 个字母数字字符的最有效的正则表达式

    我有这个正则表达式 a zA Z0 9 3 我用它来查看字符串中是否至少包含 3 个字母数字字符 似乎有效 它应该匹配的字符串示例 a3c 0 c 8 9 9d 但是 我需要它更快地工作 有没有更好的方法使用正则表达式来匹配相同的模式 编辑
  • 具有值的 TextInput 不会更改值

    在我的react native应用程序中 我有一个API 我从中检索数据 并且我在输入值中设置数据 用户应该能够编辑这些输入并更新 但是当我尝试输入输入时它不会输入任何内容并且值保持原样 这是 TextInput 代码

随机推荐

  • 在 SQL Server 中插入数据时,如何处理数据表中的 NULL 值变成缺失的 XML 元素?

    我想在 SQL Server 2005 中使用 XML 插入数据 因此我从后端获取了一个数据表 并按如下方式传递了该数据表 DataSet dsItem new DataSet DTItem TableName ItemDetails DT
  • ASP.NET MVC 2 - POST 后 ViewData 为空

    我真的不知道在哪里寻找错误 情况 我有一个 ASPX 视图 其中包含一个表单和一些输入 当我单击 提交 按钮时 所有内容都会 POST 到我的一个 ASP NET MVC 操作 当我在那里设置断点时 它被正确命中 当我使用 FireBug
  • 为什么我的布尔变量的值在回发之间丢失

    我有一个名为 CheckBoxActivated 的布尔变量 在验证用户名和密码后将其分配为 true string name us UserName string password us Password if name Equals t
  • sqlite 中的 strftime 转换为 postgres

    我在 sqlite 中遇到一个函数 需要将其转换为 postgres 语法 它是date date strftime w date days 谁能帮我将此 sqlite 段转换为 postgres 吗 这个 SQLite date date
  • 如何从同一个类中的静态函数调用公共事件?

    我有一个类 其中包含另一个类的 ObservableCollection 如果类成员之一发生更改 我希望收到通知 因为我需要在 MediaCollection 类中进行一些计算 所以我向该类添加了一个事件 public event Prop
  • 处理大文件或多个文件时 file_put_contents 太慢

    我在用文件放置内容创建视频文件 问题是速度和性能 创建平均大小为 50 mb 的文件平均需要大约 30 到 60 分钟 而且这还只是一个文件 我正在解码字节数组以创建文件 如何提高速度和性能 json str file get conten
  • Unity 3 按约定配置未在 Web 项目中找到类型

    我正在尝试使此约定配置正常工作 但我的 ASP NET MVC5 项目遇到问题 我在 Application Start 方法中添加了以下内容并将其连接到 DependencyResolver public static IUnityCon
  • 在使用 Java 8 重新协商 TLS_1.2 期间,服务器证书更改受到限制

    我对 SSL 还很陌生 并且遇到了一些看似已知的问题 我的应用程序是 SSL 客户端 并调用另一个启用双向 SSL 的组件 两个组件中的证书都是正确的 并且连接有时工作正常 每个服务器都有自己的服务器证书和私钥 但根证书和中间证书相同 服务
  • 如何迭代每隔一个数字

    阅读文档时 我注意到一句话 Rust 没有C stylefor 循环 所以 我想知道 如何制作一个相当于for i 0 i lt 10 i 2 我能想到的方法是这样的 for i in 0 10 if i 2 0 Do stuff Or e
  • 如何获取2d dict python中的所有键

    我有一本形式词典 d 123 2 1 3 1 124 3 1 125 2 1 126 1 1 那么 让我们看看二阶键 123 gt 2 3 124 gt 3 125 gt 2 126 gt 1 所以唯一的二阶键的总数是 1 2 3 现在 我
  • 在 Flash 对象上方显示图像

    我在这里面临着一个棘手的情况 这就是问题 我有一个 Flash 对象 我想在其上显示图像这些是我尝试过的技巧 1 玩转z index 没用 2 将wmode参数设置为透明 不透明 同样没有用 3 使用javascript并仅在页面加载后显示
  • 没有这样的模块“RestKit”与 cocoapods 和 swift

    我在一个全新的项目中遇到了这个问题 RestKit 和 Facebook SDK 都会出现此问题 奇怪的是 SwiftyJSON 工作得很好 我创建了一个全新的 swift 项目和一个 Podfile 其中包含 source https g
  • 当 CURLOPT_HTTPHEADER 需要“Content-Length”时

    我的应用程序的客户端中有此代码 ch curl init url curl setopt ch CURLOPT CUSTOMREQUEST GET curl setopt ch CURLOPT RETURNTRANSFER true cur
  • Ruby on Rails 过滤返回模型对象的属性

    我正在为 Rails 应用程序创建 API 我想返回User用于 API 调用但没有的对象crypted password salt or login token属性 有没有办法做这样的事情 do api fetch user u user
  • 命名空间 + 函数与类上的静态方法

    假设我已经或将要编写一组相关函数 假设它们与数学相关 从组织上来说 我应该 编写这些函数并将它们放入我的MyMath命名空间并通过引用它们MyMath XYZ 创建一个名为MyMath并使这些方法静态并引用类似的MyMath XYZ 为什么
  • iOS-示例中的协议和委托

    好吧 我正在寻找 但没有任何方法对我有用 以下代码基于许多教程和苹果文档 但我无法让它工作 有人可以帮忙吗 代码崩溃于 obj delegatee self 在 B h 类中 respondsToSelector 和 PerformSele
  • 尝试使用工作台将 postgresql 数据库迁移到 mysql 时出错

    我正在尝试按照本教程将 postgresql 数据库迁移到 mysql http mysqlworkbench org 2012 11 how to migrate postgresql databases to mysql using t
  • Healpy python-3..4 在 ubuntu-14.04 上的安装问题

    我是 ubuntu 新手 在 lenovo t410 上使用 ubuntu 14 04 和 python 3 4 为了安装 Healpy 我遵循了以下步骤 我已经使用安装了 python3 dev 包 sudo apt get instal
  • Visual Studio Code / powershell 命令历史记录向上键

    我可以通过什么方式在 Visual Studio Code 中记录之前输入的命令 例如 当我按下向上键时 我可以向上浏览之前的所有命令 如果可能的话 我想将这些记录到文件中 它们本地存储在哪里 我可以用节点之类的东西记录它吗 实际上 我自己
  • 在页面显示到屏幕之前删除 DOM 元素(在 Chrome 扩展中)

    我正在尝试创建一个扩展 该扩展将在页面显示到屏幕上之前删除某些页面元素 按 id 或类 我尝试在文档上使用事件侦听器 以 DOMContentLoaded 作为事件 但 javascript 似乎在页面显示给用户后执行 然后删除它 所以它不