繁体   English   中英

如何使用 JavaScript 创建一个 Chrome 扩展来隐藏或删除页面元素?

[英]How to create a Chrome Extension to Hide or Remove a Page Element using JavaScript?

我正在尝试创建一个Chrome 扩展来操作页面上的 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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM