Javascript 在页面显示到屏幕之前删除DOM元素(在Chrome扩展中)
我正在尝试创建一个扩展,在页面显示到屏幕之前,它将删除某些页面元素(按id或类)。我曾尝试在文档上使用事件监听器,将“DOMContentLoaded”作为事件,但javascript似乎在页面显示给用户后执行,然后将其删除,因此它不像我希望的那样平滑(根本不显示不需要的内容) 这是我的扩展使用的内容脚本,它在加载页面后删除。在用户看到页面之前,我需要使用什么来修改DOM?在Javascript 在页面显示到屏幕之前删除DOM元素(在Chrome扩展中),javascript,google-chrome-extension,Javascript,Google Chrome Extension,我正在尝试创建一个扩展,在页面显示到屏幕之前,它将删除某些页面元素(按id或类)。我曾尝试在文档上使用事件监听器,将“DOMContentLoaded”作为事件,但javascript似乎在页面显示给用户后执行,然后将其删除,因此它不像我希望的那样平滑(根本不显示不需要的内容) 这是我的扩展使用的内容脚本,它在加载页面后删除。在用户看到页面之前,我需要使用什么来修改DOM?在document\u start注入的内容脚本中使用,以便在页面加载期间,在呈现HTML元素之前,从DOM中实际删除HTM
document\u start
注入的内容脚本中使用,以便在页面加载期间,在呈现HTML元素之前,从DOM中实际删除HTML元素,从而避免闪烁
- manifest.json:
- content.js:
- 观察者回调必须简单快速,以避免在页面加载期间引入延迟,因此使用简单选择器和直接DOM访问,而不是jQuery
- 工作完成后,最好立即断开观察者的连接,这样页面的其余部分就不会被不必要的观察到
- 不要添加多个观察者,将所有检查合并到一个观察者中
数组还包含添加的元素本身。这就是为什么我们要确保标记名突变
存在的原因-这意味着节点是一个元素
- 例如,每个变异的
数组通常都有容器元素,如addedNodes
,而容器元素中又可能有我们想要删除的元素。因此,我们必须使用DIV
或querySelector
来检查它queryselectoral
- 从Chrome 23开始工作
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);
});
{
"name": "Delete elements",
"version": "1.0",
"content_scripts": [
{
"matches": ["http://somesite.com/*"],
"run_at": "document_start",
"all_frames": true,
"js": ["content.js"]
}
],
"manifest_version": 2
}
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) {
const toRemove = [];
for (const {addedNodes} of mutations) {
for (const n of addedNodes) {
if (n.tagName) {
if (n.matches(DEL_SELECTOR)) {
toRemove.push(n);
} else if (n.firstElementChild && n.querySelector(DEL_SELECTOR)) {
toRemove.push(...n.querySelectorAll(DEL_SELECTOR));
}
}
}
}
if (toRemove.length) {
mo.disconnect();
for (const el of toRemove) el.remove();
observe();
}
}
function observe() {
mo.observe(document, {
subtree: true,
childList: true,
});
}