2011-03-27 22 views
8

chrome.tabs.get aparentemente no funciona en el script de contenido, y aparte de enviarlo a través de chrome.extension.sendRequest No tengo idea de cómo hacer que el fondo responda a la pestaña correcta.¿Cómo obtener el id de una pestaña de Chrome?

¿Cómo puedo hacer que el script de contenido envíe información a la página de fondo, luego la página de fondo devuelve la información a la pestaña de donde vino?

Respuesta

8

EDIT: esta respuesta es obsoleta y usa funciones obsoletas. Por favor use otras respuestas en su lugar.

Pues déjenme explicar loco;)

En primer lugar enviar un mensaje de su contenido-script como el siguiente:

contenido de la escritura - Enviar el mensaje

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

Antecedentes Página - Reciba el mensaje y la respuesta

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 - Añada un receptor

chrome.extension.onRequest.addListener(function(request, sender, sendResponse){ 
    if(request.action) 
{ 
    alert('The response is : ' + request.action); 
} 
}); 
+3

Si alguien quiere utilizar esta solución, prestar atención a que está en desuso este método. Use chrome.runtime.onMessage en su lugar –

+0

chrome.tabs.getSelected también está en desuso desde Chrome 33. Utilice tabs.query {active: true}. https://developer.chrome.com/extensions/tabs#method-query –

4

onMessage proporciona una función de sendResponse que se puede utilizar para enviar una respuesta directamente de vuelta al remitente.

background.js extracto:

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

content_scripts.js extracto:

var tabId; 
chrome.extension.sendMessage({ type: 'getTabId' }, function(res) { 
    tabId = res.tabId; 
}); 
3

Como cortesía a cualquiera que vea esta pregunta posterior a 2011, he proporcionado una respuesta que utiliza las nuevas convenciones y APIs. Esta es una pregunta bastante popular y la respuesta aceptada está algo anticuada en este punto (pero sigue siendo una respuesta precisa, sin embargo), por lo que para los recién llegados esto debería brindar una respuesta más clara y aplicable a la pregunta.

Para empezar, puede enviar un mensaje desde el script de contenido usando chrome.runtime.sendMessage. Esto enviará indiscriminadamente el mensaje cuando se produce un evento de tiempo de ejecución (es decir, se hace clic en la acción del navegador). Se verá algo como esto:

content.js

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

Ya que se necesita para comunicarse con una página del evento (de conformidad con las convenciones más recientes, la página del evento es la opción preferida sobre el fondo persistente página) para captar información sobre la pestaña activa (suponiendo que solo desea la identificación de la pestaña), puede tomar esa información agregando un detector de eventos en tiempo de ejecución y verificando el parámetro sender. Se verá algo como esto:

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

Sin embargo, ya que necesitamos para entregar esa información a la secuencia de comandos de contenido, tendremos que volver atrás y añadir un controlador de devolución de llamada para chrome.runtime.sendMessage. Ahora se verá algo como esto:

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

Esta configuración permitirá ahora a pasar, mensajes simples de una sola vez de content.js a event.js, donde event.js proporciona información a content.js .

Nuevamente, esta es solo una versión actualizada de la respuesta aceptada para aquellos que deseen un ejemplo de cómo funciona el nuevo enfoque.

1

Get pestaña Identificación delcompleto ejemplo

(Verdad: más claras definiciones completas: ejemplos tener.)

≪ manifiesto .json ≫:

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

≪ bg .js ≫:

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

≪ contenido .js ≫:

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

extensión de recarga, ir a una pestaña, actualización de la página, espera, comprobar ≪ contenido .js ≫ OKS, espera, comprobar OKS cb, espera, comprobar <console.log> oks, p. ej .:

enter image description here



Comprobar

parche completo –:

≪ bg .js ≫:

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

≪ contenido .js ≫:

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'); 
Cuestiones relacionadas