chrome.windows.create создает новые всплывающие окна при многократном выполнении

#javascript #google-chrome-extension #popup

#язык JavaScript #google-chrome-расширение #всплывающий

Вопрос:

У меня есть это расширение chrome с кнопкой browser_action. При нажатии на это действие браузера фоновый скрипт открывает всплывающее окно следующим образом

 const popup = window.open('popup.html', tab.id, 'menubar=0,innerWidth=900,innerHeight=800');  

Когда пользователь несколько раз нажимает на действие браузера, всплывающее окно каждый раз создается заново (у меня нет нескольких всплывающих окон).

Однако теперь я хотел бы заменить этот код, browser.windows.create который, насколько я знаю, больше подходит для расширения. Поэтому я создал

 browser.windows.create({url: 'popup.html', height: 800, width: 900, type: 'popup'});  

Это работает почти одинаково, за исключением того, что, когда пользователь несколько раз нажимает кнопку действия браузера, я получаю несколько всплывающих окон, а это не то, что я хочу. Есть ли способ получить такое же поведение, как «window.open»?

Ответ №1:

Вот мое предложение (в машинописном виде):

 function findTab(tab: chrome.tabs.Tab) {  return tab.url == "popup.html"; }  // first get all open chrome windows let windows = await chrome.windows.getAll({populate: true, windowTypes: ["popup"]});  // find a window that has a tab with the url "popup.html" let myWindow = windows.find(window =gt; window.tabs.some(tab =gt; findTab(tab)));  // find a tab that has the url "popup.html" let myTab = myWindow?.tabs.find(tab =gt; findTab(tab));  if (myWindow amp;amp; myTab) {  // if such tab exists, focus the parent window and the tab  await chrome.windows.update(myWindow.id, {focused: true});  await chrome.tabs.update(myTab.id, {active: true}); } else {  // open the window and the tab  await chrome.windows.create({url: "popup.html", type: "popup"}); }  

Комментарии:

1. Да, это работает. Большое спасибо!