Ошибка в обработчике событий: ReferenceError: окно не определено расширением Chrome с помощью Menifest v3
Я использую версию манифеста 3 для расширения Chrome, эта ошибка, с которой я сталкиваюсь в фоновом режиме js: Ошибка в обработчике событий: ReferenceError: окно не определено расширение Chrome с помощью Menifest v3
"manifest_version":3,"permissions":["contextMenus","storage", "activeTab","tabs","scripting","webRequest"],
var posLeft = ( window.width - winWidth ) / 2 ;
3 ответа
Расширение ManifestV3 использует сервис-воркер, поэтому у него нет DOM или
window
. Надеемся, что будет реализован альтернативный API, нажмите звездочку в https://crbug.com/1180610.
В качестве обходного пути вы можете открыть свернутое окно, прочитать там размер экрана, а затем изменить его размер.
Страница расширения
вспомогательный работник службы:
chrome.windows.create({url: 'hello.html', state: 'minimized'});
hello.html:
<head> <script src=hello.js></script>
hello.js:
resizeWindow(chrome.windows.WINDOW_ID_CURRENT, 500, 300); function resizeWindow(id, w, h) { chrome.windows.update(id, { left: (screen.availWidth - w) / 2, top: (screen.availHeight - h) / 2, width: w, height: h, state: 'normal', }); }
страница в Интернете
manifest.json:
{ "content_scripts": [{ "matches": ["*://*.your.web.url/*"], "js": ["content.js"], "run_at": "document_start" }],
content.js:
chrome.runtime.sendMessage({ type: 'screenSize', w: screen.availWidth, h: screen.availHeight, }); document.addEventListener('DOMContentLoaded', () => { // process the page here }, {once: true});
вспомогательный работник службы:
chrome.windows.create({url: 'https://your.web.url', state: 'minimized'}, wnd => { chrome.runtime.onMessage.addListener(function onMessage(msg, sender) { if (msg.type === 'screenSize' && sender.tab?.id === wnd.tabs[0].id) { chrome.runtime.onMessage.removeListener(onMessage); const width = 500, height = 300; chrome.windows.update(wnd.id, { width, height, left: (msg.w - width) / 2, top: (msg.h - height) / 2, state: 'normal', }); } }) });
Если вы пытаетесь получить доступ к оконному объекту в background.js, поскольку он является сервисным работником, у вас не будет доступа к оконному объекту, но вы можете попробовать себя, так как он будет иметь все свойства оконного объекта вbackground.js
пытаться
console.log(self,"self")
var window = window ?? self;
Note: if you are using Vite or Webpack this might work
Что ж, для других, кто может искать здесь это сообщение об ошибке в аналогичном контексте, я получил ту же ошибку, когда пренебрегал доступностью объекта во время выполнения, а не в то время, когда внедренная функция динамически готовится для инъекции в конкретную вкладку с помощью фоновый скрипт v3.
Чтобы динамически внедряться из фонового скрипта v3, объект, специфичный для вкладки (в данном случае
window
) необходимо включить в передаваемую функцию, как в следующем случае анонимной функции:
chrome.scripting.executeScript({
target: { tabId: currentTab.id },
func: () => window.history.back()
});
если
window.history.back
предоставляется как значение для
func
тогда очевидно, что фоновый скрипт не узнает об этом или не будет его использовать, и появится то же сообщение об ошибке.
Это уже действительно описано в документации.