这是我第一次创建Google Chrome扩展程序,在YouTube上点击建议的视频或任何视频时,我无法找到一种方法可靠地让内容脚本运行一次。我已经尝试将“all_frames”设置为true,但这会多次调用脚本。在浏览YouTube视频时,是否有一种简单的方法可以在每个视频中运行一次内容脚本?
PS:我使用YouTube作为我的主要示例,但此问题存在于其他网站上。是什么导致它,我该如何解决?
{//manifest.json
"name": "Test",
"version": "0.0.1",
"content_scripts": [{
"matches": ["<all_urls>"],
"js": ["run.js"],
}],
"permissions": ["activeTab"],
"manifest_version": 3
}
-
//run.js
console.log('running');
答案 0 :(得分:1)
问题在于,Youtube动态更新页面,因此内容页面并非总是在更改页面内容后运行。 您需要检测页面网址是否已更改。
有两种检测内容更改的方法。
解决方案
您需要在 manifest.json 中设置webNavigation的权限:
"permissions": [
*"tabs", "webNavigation"*
]
background.js
chrome.webNavigation.onHistoryStateUpdated.addListener(function(details) {
//Send message to content Script -> Page was changed
//or execute parser from here
// chrome.tabs.executeScript
});
content.js //解析您的内容
MutationObserver接口提供了监视DOM树所做更改的功能。
// Select the node that will be observed for mutations
var targetNode = document.getElementById('some-id');
// Options for the observer (which mutations to observe)
var config = { attributes: true, childList: true, subtree: true };
// Callback function to execute when mutations are observed
var callback = function(mutationsList) {
for(var mutation of mutationsList) {
if (mutation.type == 'childList') {
// do something with content
}
else if (mutation.type == 'subtree') {
// do something with content
}
}
};
// Create an observer instance linked to the callback function
var observer = new MutationObserver(callback);
// Start observing the target node for configured mutations
observer.observe(targetNode, config);
// Later, you can stop observing
observer.disconnect();