为什么.js代码可以通过控制台运行,而不能以插件的形式运行?
2024-02-12
81
我正在尝试删除一个元素 为此,我尝试在 .js 中制作一个小插件 我已经针对我想要使用的这个特定的 google 表单定制了这个插件,出于某种原因,我在 docs.google.com 上遇到的问题比在其他网站上遇到的问题更多
// content.js
const element = document.getElementsByClassName("xxxxxx");
element[0].remove();
“xxxxx”是保存电子邮件显示的块的类,我在这里更改了它,不知道是否可以用它来提取电子邮件
当我手动将代码粘贴到控制台中时,它会按我想要的方式工作, 但如果我通过插件运行它,它会给我一个错误代码: “未捕获的类型错误:无法读取未定义的属性(读取'remove')”
编辑: 根据请求的 manifest.json 和计时器,我敢打赌还有更好的方法它
//manifest.json
{
"manifest_version": 3,
"name": "Auto Delete xxxxxx Elements",
"version": "1.0",
"description": "A Chrome extension to automatically delete elements containing the class 'xxxxxx' on doc.google.com.",
"permissions": ["activeTab"],
"background": {
"service_worker": "background.js"
},
"content_scripts": [
{
"matches": ["*://docs.google.com/*"],
"js": ["content.js"]
}
]
}
// background.js
chrome.runtime.onInstalled.addListener(() => {
setInterval(() => {
chrome.tabs.query({ url: "*://docs.google.com/*" }, tabs => {
tabs.forEach(tab => {
chrome.scripting.executeScript({
target: { tabId: tab.id },
files: ['content.js']
});
});
});
}, 1000); // 1000 milliseconds = 1 second
});
2个回答
当您尝试访问其 remove() 方法时,element[0] 似乎未定义。 插件可能在元素加载到页面之前执行。
您可以更改插件代码,等待页面加载,然后再调用 remove 函数,该函数通过 DOMContentLoaded 事件或 window.onload 事件删除元素。
类似以下内容:
document.addEventListener('DOMContentLoaded', function() {
const element = document.getElementsByClassName("xxxxxx");
if (element.length > 0) {
element[0].remove();
} else {
console.error("Element with class 'xxxxxx' not found.");
}
});
因此,在这里它会等待 DOMContentLoaded 事件,然后再调用 remove()。 它还会在尝试删除类为“xxxxxx”的元素之前检查该元素是否存在。
编辑:尝试对 background.js 执行此操作
chrome.runtime.onInstalled.addListener(() => {
chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
if (changeInfo.status === 'complete' && tab.url.startsWith('https://docs.google.com/')) {
chrome.scripting.executeScript({
target: { tabId: tabId },
files: ['content.js']
});
}
});
});
Joshua George
2024-02-12
我并不是那么熟练,但是您可能会因为所有嵌套而收到该错误,请尝试一下。
const element = document.getElementsByClassName("xxxxxx");
element[0].innerHTML = "";
element[0].remove();
此外,请确保在插件执行代码之前网站已完全加载。
EmetsAlt
2024-02-12