参考错误:将 chrome 扩展迁移到 MV3 时,未在 bg.js 文件中定义文档

ReferenceError: document is not defined in bg.js file when migrating chrome extension to MV3

提问人:gogilan 提问时间:2/11/2022 更新时间:3/13/2023 访问量:3315

问:

我正在将我的 chrome 扩展代码从 Manifest V2 迁移到 V3。但是,我在 bg.js 文件的第 9 行中收到“参考错误:文档未定义”。有人知道为什么吗?它在 MV2 中工作正常

BG的.js

   //Listen for messages
chrome.runtime.onMessage.addListener((msg, sender, response) => {

  if(msg.name == "playTrack"){

    //...
    var trackName = msg.track;
    var audioEle = document.querySelector('.audio-element');
    audioEle.src = 'track-'+trackName+'.mp3';
    audioEle.play();

  }

  if(msg.name == "pauseTrack"){

    var audioEle = document.querySelector('.audio-element');
    audioEle.pause();
  }

});
    

manifest.json

    {
  "name": "Sizzo",
  "version": "0.01",
  "description": "Sizzo - Stay flawless with the perfect audio reminders",
    "action": {
        "default_title": "Sizzo",
        "default_popup": "popout.html"
    },
  "background":{
    "service_worker": "bg.js"
  },
  "icons": { "48": "icon48.jpg",
             "128": "icon128.jpg" },
  "manifest_version": 3
}

弹出式 .js

   document.querySelector('button.play').addEventListener('click', function(){
  var SelTrack = document.querySelector('select').value;

  chrome.runtime.sendMessage({name: "playTrack", track: SelTrack});

});


document.querySelector('button.pause').addEventListener('click', function(){

  chrome.runtime.sendMessage({name: "pauseTrack"});

});
javascript google-chrome-extension 错误处理

评论

2赞 wOxxOm 2/11/2022
Service Worker 没有文档或音频等 DOM 内容。ManifestV3 尚不支持背景音频。

答:

0赞 fregante 3/13/2023 #1

MV3 后台工作线程是 Service Worker,它们不是文档,缺少 DOM API。

即使在 MV3 中,Firefox 也会支持常规的后台页面,但在 Chrome 中,您必须使用文档来访问 DOM APIoffscreen

像这样:

// background-worker.js
chrome.offscreen.createDocument({
  url: chrome.runtime.getURL('off_screen.html'),
  reasons: ['AUDIO_PLAYBACK'],
  justification: 'Playing audio on the user’s request',
});
// off_screen.html
<script src="off_screen.js">
// off_screen.js
new Audio('elevator-music.mp3').play()