内容脚本仅在重新加载/刷新时加载

时间:2018-04-05 05:51:22

标签: javascript google-chrome-extension content-script

这是我第一次创建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');

1 个答案:

答案 0 :(得分:1)

问题在于,Youtube动态更新页面,因此内容页面并非总是在更改页面内容后运行。 您需要检测页面网址是否已更改。

有两种检测内容更改的方法。

解决方案

  1. 使用chrome.webNavigation.onHistoryStateUpdated事件来检测内容是否已更改。

您需要在 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 //解析您的内容

  1. Use Mutation Observers:,位于您的内容脚本中。

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();