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

问题描述

我正在尝试创建一个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>

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...