javascript - 如何创建 Chrome 扩展程序以使用 JavaScript 隐藏或删除页面元素?

标签 javascript html dom google-chrome-extension code-injection

我正在尝试创建一个 Chrome Extension操作页面上的 HTML。 该扩展程序应在激活时从页面中删除或隐藏某些元素。

我创建了一个简单的 manifest.json 文件:

{
  "manifest_version": 2,

  "name": "hide-msgs-ext",
  "version": "0.0.1",
  "description": "Hide msgs extension",

  "content_scripts": [{
    "js": ["content.js"],
    "matches": ["https://website.example.com/*"],
    "run_at":  "document_idle"
  }]

}

和一个脚本 content.js,它应该删除/隐藏我所有的目标元素:

var elements = document.querySelectorAll('div.card');
for (var i = 0, l = elements.length; i < l; i++) {
  subElement = elements[i].querySelector(':scope div.card-body');
  if (subElement.firstChild.tagName != 'A') {
    elements[i].style.display = "none";
  }
}

如果我在 chrome 控制台中执行上述脚本,我可以隐藏我想要的所有元素,并且不会触发任何错误。但是我不知道如何让它在扩展中工作。

有人能指出我正确的方向吗? 提前谢谢你!

最佳答案

听起来内容可能是在页面加载后由 javascript 创建的,因此您需要等待它出现。您可以将代码包装在一个函数中并在超时后执行它:

function hideCards() {
  var elements = document.querySelectorAll('div.card');
  for (var i = 0, l = elements.length; i < l; i++) {
    subElement = elements[i].querySelector(':scope div.card-body');
    if (subElement.firstChild.tagName != 'A') {
      elements[i].style.display = "none";
    }
  }
}

// execute after a second to give the page time to create the
// elements you want to remove
setTimeout(hideCards, 1000);

如果您希望它在页面的整个生命周期内都有效并且速度非常快,您可以尝试使用 MutationObserver .这使您可以监听 DOM 更改。这是如何使用它的示例。 “添加项目”按钮添加一个新项目,每个其他项目都有“删除我”类。 MutationObserver 执行一个函数,该函数自动删除任何添加到该类的 LI 节点,这样它们就不会出现:

const observer = new MutationObserver(function(mutations) {
  let added = [];
  for (let i = 0; i < mutations.length; i++) {
    let m = mutations[i];
    for (let j = 0; j < m.addedNodes.length; j++) {
      let n = m.addedNodes[j];
      if (n.tagName === 'LI' && n.classList.contains('remove-me')) {
        added.push(n);
      }
    }
  }
  added.forEach(element => element.remove())
});

const config = { subtree: true, childList: true };
observer.observe(document.body, config);
 
let index = 0;
document.getElementById('btnAddItem')
.addEventListener('click', (event) => {
  let li = document.createElement('li');
  if (index & 1 == 1)  li.classList.add('remove-me');
  li.innerText = `Item ${index++}`;
  document.getElementById('myList').appendChild(li);
});
<ol id="myList">
  <li>First Item</li>
</ol>

<button id="btnAddItem">Add Item</button>

关于javascript - 如何创建 Chrome 扩展程序以使用 JavaScript 隐藏或删除页面元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63820489/

相关文章:

javascript - 等待异步函数后不会调用 onload 事件监听器

dom - 单元格的有效 GWT DOM/消费事件的列表是什么?

android - 在 Visual Studio 2010 中使用 Jquery Mobile 的 HTML 和 CSS

html - 缩小页面时的 css3 最小-最大宽度

firefox - 使用 Firefox 检查 Shadow DOM

java - 在 Java 中检索 XML 文件的节点列表

javascript - 具有不同最大值的jquery slider 不起作用

javascript - 我希望我的 Controller 在执行其他操作之前等待我的指令完成

javascript - 在传单 map 控制图层中切换标记的正确方法是什么?

html - 想拖动我的 div 而不显示水平滚动