Закрытие всплывающего окна, созданного расширением Google Chrome - PullRequest
23 голосов
/ 17 октября 2010

Я пытаюсь создать расширение для Chrome, которое заменяет букмарклет Delicious. Я знаю, что уже есть расширение, которое делает это, но проблема с этим расширением заключается в том, что после того, как вы добавили в закладки сайт, всплывающее окно остается открытым (в отличие от использования букмарклета, где всплывающее окно закрывается после отправки формы. расширение и столкнулся с той же проблемой.

Вот мой код:

manifest.json:

{
  "name": "Delicious",
  "version": "1.0",
  "description": "Bookmark a site on Delicious",
  "background_page": "background.html",
  "permissions": [ 
    "tabs" 
  ],
  "browser_action": {
    "default_icon": "delicious.png"
  },
  "content_scripts": [
    {
      "matches": ["http://www.delicious.com/save*"],
      "js": ["contentscript.js"]
    }
  ]
}

background.html:

<html><script>
chrome.browserAction.onClicked.addListener(function(tab) {
  chrome.tabs.getSelected(null, function(tab) {
    w = window.open('http://delicious.com/save?url='+
          encodeURIComponent(tab.url)+
          '&title='+encodeURIComponent(tab.title)+
          '&v=5&noui=1&jump=close',
        'deliciousuiv5',
        'location=yes,links=no,scrollbars=no,toolbar=no,width=550,height=550');
  });
});
</script></html>

contentscript.js:

if (document.URL == 'http://www.delicious.com/save')
{
  alert('closing...');
  self.close();
  alert('should have closed by now');
}

Когда я нажимаю кнопку Delicious, всплывающее окно появляется нормально, и я могу сохранить закладку, но после нажатия кнопки «Сохранить» всплывающее окно не закрывается. Обе тревоги появляются, но self.close(), похоже, ничего не делает. Когда я удаляю проверку URL-адреса в contentscript.js, всплывающее окно появляется как обычно, сразу же срабатывает первое предупреждение, а затем оно закрывается (как и должно быть).

Почему это не работает? Не похоже, что Chrome мешает мне делать self.close (). Delicious делает что-то? Это что-то еще?

Файлы здесь, если вы хотите их: [ссылка удалена, поскольку drop.io обанкротилась]

Ответы [ 4 ]

18 голосов
/ 17 октября 2010

Попробуйте window.close(), но, вероятно, это тоже не сработает.

Поскольку вы создаете обычное окно (а не всплывающее окно действий браузера), вы можете закрыть его, используя chrome.tabs.remove() на фоновой странице,Вы также можете обнаружить это окно на фоновой странице.Что-то вроде:

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
    if(changeInfo.status == "loading") {
        if(tab.url == "http://www.delicious.com/save") {
            chrome.tabs.remove(tabId);
        }
    }
});

Я не уверен, как Chrome обрабатывает созданные окна - как вкладки или окна.Если в качестве окон, то приведенный выше код будет немного другим.

9 голосов
/ 12 ноября 2010

Я нашел очень легкий способ обойти это. Вы просто устанавливаете для выбранной вкладки значение True, и всплывающее окно исчезает, как это ...

// remove popup by selecting the tab
chrome.tabs.getSelected(null, function(tab) {
    chrome.tabs.update(tab.id, { selected: true } )
});
0 голосов
/ 08 августа 2018

getSelected не работает для меня, поэтому я нашел это решение

chrome.tabs.create({url: 'https://www.google.com', active: false});

в background.js вам нужно просто

window.close();
0 голосов
/ 26 июля 2013

Я нашел это решение: chrome.tabs.update({ active: true }); Эта единственная строка кода закрывает всплывающее окно действия браузера.Вам даже не нужно передавать туда tab.id, потому что по умолчанию он установлен на id текущей вкладки.Я запускаю его на фоновой странице, но, кажется, его можно запустить везде в расширении.

...