Как получить идентификатор вкладки Chrome? - PullRequest
9 голосов
/ 27 марта 2011

chrome.tabs.get, очевидно, не работает в скрипте содержимого, кроме отправки через chrome.extension.sendRequest Я не знаю, как заставить фон реагировать на правильную вкладку.

Как сделать так, чтобы скрипт содержимого отправлял информацию на фоновую страницу, а затем фоновая страница возвращает информацию обратно на вкладку, откуда она появилась?

Ответы [ 4 ]

11 голосов
/ 27 марта 2011

РЕДАКТИРОВАТЬ : этот ответ устарел и использует устаревшие функции. Пожалуйста, используйте другие ответы.

Хорошо, позвольте мне объяснить вам, чувак;)

Прежде всего отправьте сообщение из вашего контент-скрипта так:

Content Script - отправка сообщения

chrome.extension.sendRequest({ action: "WhatYouWant"});

Фоновая страница - получение сообщения и ответа

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) 
{   

    if(request.action)
    {

        // Make what you want
        chrome.tabs.getSelected(null, function(tabs) {
            chrome.tabs.sendRequest(tabs.id, { action: "response" });
        });     
    }
});

ContentScript - Добавить слушателя

chrome.extension.onRequest.addListener(function(request, sender, sendResponse){
    if(request.action)
{
    alert('The response is : ' + request.action);
}
});
4 голосов
/ 21 февраля 2013

onMessage предоставляет функцию sendResponse, которую можно использовать для отправки ответа обратно отправителю.

background.js выдержка:

chrome.extension.onMessage.addListener(
    function(message, sender, sendResponse) {
        if ( message.type == 'getTabId' )
        {
            sendResponse({ tabId: sender.tab.id });
        }
    }
);

content_scripts.js выдержка:

var tabId;
chrome.extension.sendMessage({ type: 'getTabId' }, function(res) {
    tabId = res.tabId;
});
3 голосов
/ 06 октября 2015

В качестве любезности всем, кто просматривает этот вопрос после 2011 года, я предоставил ответ, в котором используются более новые соглашения и API.Это довольно популярный вопрос, и принятый ответ несколько устарел на данный момент (но все же точный ответ, тем не менее), поэтому для всех новичков это, как мы надеемся, должно дать более четкий и более применимый ответ на вопрос.Для начала вы можете отправить сообщение из скрипта контента, используя chrome.runtime.sendMessage .Это без разбора отправит сообщение, когда произойдет событие времени выполнения (т. Е. Щелкнет действие браузера).Это будет выглядеть примерно так:

content.js

chrome.runtime.sendMessage({ from: 'content', message: 'info to send' });

Поскольку вам необходимо связаться со страницей события (в соответствии с более новыми соглашениями, страница события)предпочтительнее, чем постоянная фоновая страница) для получения информации об активной вкладке (при условии, что вам нужен только идентификатор вкладки), вы можете получить эту информацию, добавив прослушиватель событий времени выполнения и проверив параметр sender.Это будет выглядеть примерно так:

event.js

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
  if (request.from == 'content') {
    // tabId will hold the sender tab's id value
    var tabId = sender.tab.id;
    sendResponse({ from: 'event', message: 'any info to send back', tabId: tabId });
}});

Однако, поскольку нам нужно доставить эту информацию обратно в скрипт контента, нам понадобитсячтобы вернуться и добавить обработчик обратного вызова в chrome.runtime.sendMessage .Теперь это будет выглядеть примерно так:

content.js

chrome.runtime.sendMessage({ from: 'content', message: 'info to send' }, function(callbackResponse) {
  if (callbackResponse.from == 'event') {
    // do what you need to do in here
    console.log(callbackResponse.tabId);
  }
});

Эта настройка теперь позволяет передавать простые одноразовые сообщения от content.jsна event.js, где event.js предоставляет информацию обратно на content.js.

Опять же, это всего лишь обновленная версия принятого ответа для тех, кому нужен пример того, как работает новый подход.

2 голосов
/ 11 февраля 2017

& Lt; Получить идентификатор вкладки & Gt; полный пример

(Правда: четкие полные определения: примеры, имеющие.)

& Lt; манифест .json & Gt;:

{"manifest_version":2, "name":"My Cool Extension", "version":"0.1",
"content_scripts":[{"matches":["<all_urls>"],
                   "js":["content.js"]
                   }
                  ],
"background":{"scripts":["bg.js"]}
}

& Lt; BG .js & Gt;:

chrome.runtime.onMessage.addListener((msg, sender_info, Reply)=> {
    Reply(sender_info);
});

& Lt; содержание .js & Gt;:

chrome.runtime.sendMessage('', (r)=> {
    console.log('content.js', 'r.tab.id', r.tab.id);
});

Перезагрузите расширение, перейдите на вкладку, обновите страницу, подождите, проверьте & lt; content .js & Gt; окс, подожди, проверь cb окс, подожди, проверь & Lt; console.log & Gt; окс, например:

enter image description here



Чек

Полный патч & ndash;:

& Lt; BG .js & Gt;:

console.log('bg.js, start');
chrome.runtime.onMessage.addListener((msg, sender_info, Reply)=> {
    console.log('bg.js, start, cb chrome.runtime.onMessage.addListener');
    console.log('bg.js', 'sender_info', sender_info);
    console.log('bg.js', 'sender_info.id', sender_info.id);
    console.log('bg.js', 'sender_info.url', sender_info.url);
    console.log('bg.js', 'sender_info.frameId', sender_info.frameId);
    console.log('bg.js', 'sender_info.tlsChannelId', sender_info.tlsChannelId);
    console.log('bg.js', 'sender_info.tab', sender_info.tab);
    console.log('bg.js', 'sender_info.tab.url', sender_info.tab.url);
    console.log('bg.js', 'sender_info.tab.favIconUrl', sender_info.tab.favIconUrl);
    console.log('bg.js', 'sender_info.tab.title', sender_info.tab.title);
    console.log('bg.js', 'sender_info.tab.incognito', sender_info.tab.incognito);
    console.log('bg.js', 'sender_info.tab.status', sender_info.tab.status);
    console.log('bg.js', 'sender_info.tab.width', sender_info.tab.width);
    console.log('bg.js', 'sender_info.tab.height', sender_info.tab.height);
    console.log('bg.js', 'sender_info.tab.id', sender_info.tab.id);
    console.log('bg.js', 'sender_info.tab.windowId', sender_info.tab.windowId);
    console.log('bg.js', 'sender_info.tab.sessionId', sender_info.tab.sessionId);
    console.log('bg.js', 'sender_info.tab.openerTabId', sender_info.tab.openerTabId);
    console.log('bg.js', 'sender_info.tab.pinned', sender_info.tab.pinned);
    console.log('bg.js', 'sender_info.tab.audible', sender_info.tab.audible);
    console.log('bg.js', 'sender_info.tab.mutedInfo', sender_info.tab.mutedInfo);
    console.log('bg.js', 'sender_info.tab.mutedInfo.muted', sender_info.tab.mutedInfo.muted);
    console.log('bg.js', 'sender_info.tab.mutedInfo.extensionId', sender_info.tab.mutedInfo.extensionId);
    console.log('bg.js', 'sender_info.tab.mutedInfo.reason', sender_info.tab.mutedInfo.reason);
    console.log('bg.js', 'sender_info.tab.highlighted', sender_info.tab.highlighted);
    console.log('bg.js', 'sender_info.tab.active', sender_info.tab.active);
    console.log('bg.js', 'sender_info.tab.discarded', sender_info.tab.discarded);
    console.log('bg.js', 'sender_info.tab.autoDiscardable', sender_info.tab.autoDiscardable);
    Reply(sender_info);
    console.log('bg.js, end, cb chrome.runtime.onMessage.addListener');
});
console.log('bg.js, end');

& Lt; содержание .js & Gt;:

console.log('content.js, start');
chrome.runtime.sendMessage('', (r)=> {
    console.log('content.js, start, cb chrome.runtime.sendMessage');
    console.log('content.js', 'r', r);
    console.log('content.js', 'r.id', r.id);
    console.log('content.js', 'r.url', r.url);
    console.log('content.js', 'r.frameId', r.frameId);
    console.log('content.js', 'r.tlsChannelId', r.tlsChannelId);
    console.log('content.js', 'r.tab', r.tab);
    console.log('content.js', 'r.tab.url', r.tab.url);
    console.log('content.js', 'r.tab.favIconUrl', r.tab.favIconUrl);
    console.log('content.js', 'r.tab.title', r.tab.title);
    console.log('content.js', 'r.tab.incognito', r.tab.incognito);
    console.log('content.js', 'r.tab.status', r.tab.status);
    console.log('content.js', 'r.tab.width', r.tab.width);
    console.log('content.js', 'r.tab.height', r.tab.height);
    console.log('content.js', 'r.tab.id', r.tab.id);
    console.log('content.js', 'r.tab.windowId', r.tab.windowId);
    console.log('content.js', 'r.tab.sessionId', r.tab.sessionId);
    console.log('content.js', 'r.tab.openerTabId', r.tab.openerTabId);
    console.log('content.js', 'r.tab.pinned', r.tab.pinned);
    console.log('content.js', 'r.tab.audible', r.tab.audible);
    console.log('content.js', 'r.tab.mutedInfo', r.tab.mutedInfo);
    console.log('content.js', 'r.tab.mutedInfo.muted', r.tab.mutedInfo.muted);
    console.log('content.js', 'r.tab.mutedInfo.extensionId', r.tab.mutedInfo.extensionId);
    console.log('content.js', 'r.tab.mutedInfo.reason', r.tab.mutedInfo.reason);
    console.log('content.js', 'r.tab.highlighted', r.tab.highlighted);
    console.log('content.js', 'r.tab.active', r.tab.active);
    console.log('content.js', 'r.tab.discarded', r.tab.discarded);
    console.log('content.js', 'r.tab.autoDiscardable', r.tab.autoDiscardable);
    console.log('content.js, end, cb chrome.runtime.sendMessage');
});
console.log('content.js, end');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...