Как получить идентификатор вкладки Chrome?

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

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

4 ответов


редактировать: этот ответ устарел и использует устаревшие функции. Пожалуйста, используйте другие ответы.

Ну давай я тебе объясню чувак ;)

прежде всего отправьте сообщение из своего контента-скрипта следующим образом:

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);
}
});

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;
});

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

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

содержание.js

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

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


≪получить tab id≫полный пример

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

≪manifest.json≫:

{"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; oks, например:

enter image description here



Регистрация

полный патч–:

& 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');