【问题标题】:How to refresh content script for chrome extension as DOM changes如何在 DOM 更改时刷新 chrome 扩展的内容脚本
【发布时间】:2017-08-16 16:34:37
【问题描述】:

我很难从 content_script 为 chrome 扩展重新运行一些简单的 JS。这基本上是我的设置。以下代码有效,但只有一次:

ma​​nifest.json

{
  "content_scripts": [ {
    "matches": ["https://www.amazon.com/*"],
    "js": ["./content_scraper.js", "./main.js"],
    "run_at": "document_end"
  } ],
  "permissions": ["tabs","webNavigation"]
}

content_scraper.js

function dataUpdater() {
  // this function scrapes the page and updates the data var
}

chrome.runtime.onMessage.addListener(
  function(message, sender, sendResponse) {
    switch(message.type) {
      case "getItems":
        sendResponse(data)
        break;
    }
  }
);

ma​​in.js

 function getItemsData() {
  chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
    chrome.tabs.sendMessage(tabs[0].id, {type: "getItems"}, function(resp) {
      resp.map(item => {
        // do some things
      }
    })
  }) 
}

document.addEventListener("DOMContentLoaded", getItemsData)

所以,上面的代码在 DOMContent 被加载之后就可以工作了。我已经尝试使用 DOMNodeInserted 事件并读取 document.readyState 以再次触发脚本,但我似乎无法从 content_scripts 访问 dataUpdater 函数。

我只是在更新 DOM 时尝试运行 content_scraper.js(位于 content_scripts 中)。感谢您的帮助!

【问题讨论】:

    标签: javascript google-chrome


    【解决方案1】:

    您需要在文档正文的subtree 上查找MutationObserver 并观察,如下所示:

    const observer = new MutationObserver(function(mutations) {
    ...   
    });
    observer.observe(document.body, { subtree: true });
    

    查看参考:https://developer.mozilla.org/cs/docs/Web/API/MutationObserver

    【讨论】:

    • 这会返回一个错误 > 未捕获的类型错误:无法在“MutationObserver”上执行“观察”:选项对象必须将“属性”、“字符数据”或“子列表”中的至少一个设置为真.
    猜你喜欢
    • 2016-03-31
    • 2012-06-20
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2015-01-01
    相关资源
    最近更新 更多