javascript 如何在addEventListener()中调用MutationObserver?

l7wslrjt  于 2023-03-28  发布在  Java
关注(0)|答案(1)|浏览(162)

我正在尝试编写一个原始的google chrome扩展,它可以获取当前youtube频道的名称。所以我使用了MutationObserver来实现这一点。MutationObserver等待所需的节点出现在页面上。所以这段代码可以工作

var observer = new MutationObserver(function (mutations) {
    if (document.querySelector("#text a")) {
      console.log(document.querySelector("#text a").innerText);
  
      observer.disconnect();
      
    }
  });
  
  const target = document.querySelector("body");
  const config = { childList: true, characterData: true };
  observer.observe(target, config);

但由于youtube在没有重新加载的情况下更改了页面的内容。我试图重新启动MutationObserver以再次获取新的频道名称。但MutationObserver不会从addEventListener调用。此示例代码不起作用:

window.addEventListener("popstate", function() { 
  
  var observer = new MutationObserver(function (mutations) {
    if (document.querySelector("#text a")) {
      console.log(document.querySelector("#text a").innerText);
  
      observer.disconnect();
      
    }
  });
  
  const target = document.querySelector("body");
  const config = { childList: true, characterData: true };
  observer.observe(target, config);
});

我如何实现这个任务,以接收所需的节点与一个新的频道名称每次的url地址的变化,而无需重新加载页面?

window.addEventListener("popstate", function() { 
  
  var observer = new MutationObserver(function (mutations) {
    if (document.querySelector("#text a")) {
      console.log(document.querySelector("#text a").innerText);
  
      observer.disconnect();
      
    }
  });
  
  const target = document.querySelector("body");
  const config = { childList: true, characterData: true };
  observer.observe(target, config);
});

如果我向前或向后查看链接的历史,除了MutationObserver调用之外,任何代码都可以工作。

ybzsozfc

ybzsozfc1#

popstate仅由浏览器操作触发(即单击后退按钮等)。Youtube修改history对象不会导致事件发生。
chrome.webNavigation.onHistoryStateUpdated会给予你一个事件来挂钩
MDN上提供了如何使用它的示例。

const filter = {
  url:
  [
    {hostContains: "example.com"},
    {hostPrefix: "developer"}
  ]
}

function logOnHistoryStateUpdated(details) {
  console.log(`onHistoryStateUpdated: ${details.url}`);
  console.log(`Transition type: ${details.transitionType}`);
  console.log(`Transition qualifiers: ${details.transitionQualifiers}`);
}

chrome.webNavigation.onHistoryStateUpdated.addListener(logOnHistoryStateUpdated, filter);

相关问题