Как получить ID Tab существующего URL - PullRequest
0 голосов
/ 02 декабря 2018

Я хочу получить ID вкладки существующих URL. Например, у меня есть 3 вкладки в Chrome Tab 1 - вкладка YouTube 2 - Google Tab 3 - это твиттер, и я хочу получить идентификатор вкладки, которая уже существует url google com

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Используйте chrome.tabs API на странице расширения , например, всплывающее окно browserAction или фоновый скрипт.

manifest.json:

"permissions": ["tabs"]

Самый простой случай - без изменений в имени домена:

chrome.tabs.query({url: 'https://www.youtube.com/*'}, tabs => {
  // use 'tabs' inside the callback
});

Простой случай - изменения в субдомене, кроме TLD (вверху)имя домена) не имеет вариантов:

chrome.tabs.query({url: 'https://*.twitter.com/*'}, tabs => {
  // use 'tabs' inside the callback
});

Трудный случай - TLD варьируется:

const RE_ALL_GOOGLE = /^https:\/\/(www\.)?google\.([a-z]{2,3}|com?\.[a-z]{2})\//;
// the tabs API doesn't accept wildcards in TLD so we need to enumerate all tabs
// and we restrict the list to https-only as an optimization for the case of many open tabs
chrome.tabs.query({url: 'https://*/*'}, tabs => {
  const googleTabs = tabs.filter(({url}) => RE_ALL_GOOGLE.test(url));
  // use 'googleTabs' here inside the callback
});

Вы можете написать более ограничительное регулярное выражение, используя полный список все домены Google и генератор RegExp, например , этот .


Скрипты содержимого не могут напрямую использовать chrome.tabs , поэтому вам потребуетсясделать это с помощью фонового скрипта.

скрипт контента:

chrome.runtime.sendMessage({
  action: 'getTabs',
  url: 'https://*/*',
  // messaging can't transfer regexps so we convert it to a string
  pattern: /^https:\/\/(www\.)?google\.([a-z]{2,3}|com?\.[a-z]{2})\//.source,
}, tabs => {
  // use 'tabs' inside the callback
});

manifest.json:

"permissions": ["tabs"],
"background": {
  "scripts": ["background.js"],
  "persistent": false
}

background.js:

chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
  if (msg.action === 'getTabs') {
    chrome.tabs.query({url: msg.url}, tabs => {
      if (msg.pattern) {
        const re = new RegExp(msg.pattern);
        tabs = tabs.filter(({url}) => re.test(url));
      }
      sendResponse(tabs);
    });
    // keep the reponse channel open since the chrome.tabs API is asynchronous
    return true;
  }
});
0 голосов
/ 02 декабря 2018

Вот пример:

// get all the tabs, you can also limit it to the current window if you wish
// chrome.tabs.query({currentWindow: true}, ...)
chrome.tabs.query({}, tabs => {

  // loop through the tabs
  for (const tab of tabs) {
    if (tab.url === 'theOneYouWant) {
      // do whatever needed with tab.id

      // break/stop the loop
      break;
    }
  }
});

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...