¿Cómo puedo obtener la URL de la pestaña actual de una extensión de Google Chrome?


Respuestas:


219

Usar chrome.tabs.query()así:

chrome.tabs.query({active: true, lastFocusedWindow: true}, tabs => {
    let url = tabs[0].url;
    // use `url` here inside the callback because it's asynchronous!
});

Esto requiere que solicite acceso a la chrome.tabsAPI en su manifiesto de extensión :

"permissions": [ ...
   "tabs"
]

Es importante tener en cuenta que la definición de su "pestaña actual" puede variar según las necesidades de su extensión.

La configuración lastFocusedWindow: trueen la consulta es apropiada cuando desea acceder a la pestaña actual en la ventana enfocada del usuario (generalmente la ventana superior).

La configuración le currentWindow: truepermite obtener la pestaña actual en la ventana donde el código de su extensión se está ejecutando actualmente. Por ejemplo, esto podría ser útil si su extensión crea una nueva ventana / ventana emergente (cambio de enfoque), pero aún quiere acceder a la información de la pestaña desde la ventana donde se ejecutó la extensión.

Elegí usar lastFocusedWindow: trueen este ejemplo, porque Google menciona casos en los que currentWindow no siempre están presentes .

Puede refinar aún más su consulta de pestañas utilizando cualquiera de las propiedades definidas aquí: chrome.tabs.query


27
¿Por qué la URL siempre está indefinida?
nnm

2
Si la URL no está definida, intente volver a cargar su extensión desde chrome: // extensiones Esto recargará la configuración de la extensión y aplicará el permiso de "pestañas" recién agregado.
flashbackzoo

2
url no está definida porque stackoverflow.com/questions/28786723/… (respuesta: cierre la ventana de herramientas de desarrollo o cambie a currentWindow en lugar de lastFocusedWindow)
kspearrin

2
Me quedé indefinido cuando mi ventana de herramientas de desarrollo estaba desacoplada. Al acoplarlo se solucionó el problema indefinido.
Fisu

Esto no devuelve la URL variable a la persona que llama. Me gustaría una función simple url = GetCurrentTabUrl () que devuelve la URL de la pestaña actual a la persona que llama. Aquí la variable está dentro de la función de devolución de llamada. Puedo pasarlo a otra función pero hace que la estructura del código sea incómoda. También me gustaría evitar el uso de variables globales. alguna idea @thauburger?
Thierry Dalon

78

¡Advertencia! chrome.tabs.getSelectedestá en desuso . Utilice chrome.tabs.querycomo se muestra en las otras respuestas.


Primero, debe establecer los permisos para la API en manifest.json:

"permissions": [
    "tabs"
]

Y para almacenar la URL:

chrome.tabs.getSelected(null,function(tab) {
    var tablink = tab.url;
});

1
La razón por la cual es solo para la ventana emergente (acción de página, acción del navegador) es porque está enviando un "nulo" al primer parámetro. code.google.com/chrome/extensions/tabs.html#method-getSelected Los documentos indican que el primer parámetro es el windowId, si desea usarlo en las opciones o en la página de fondo, necesitaría poner el id de la ventana o Obtendrá la pestaña actual de su visualización que está indefinida, opciones respectivamente.
Mohamed Mansour

1
sí, funciona, pero no estoy seguro de por qué el método chrome.tabs.getSelected no se puede encontrar en el documento de referencia.
natación

Esto no me funciona, chrome.tabs.getSelectedno está definido, ¿debería hacerlo en otra pregunta?
Mostafa Shahverdy

11
El chrome.tabs.getSelectedmétodo ha quedado en desuso, el método correcto aparece en la siguiente respuesta .
Rob W

1
Y cómo obtener enlaces de todas las pestañas abiertas
Enve

48

Otras respuestas suponen que desea saberlo desde una ventana emergente o un script de fondo.

En caso de que desee conocer la URL actual de un script de contenido , se aplica la forma estándar de JS:

window.location.toString()

Puede usar las propiedades de window.locationpara acceder a partes individuales de la URL, como el host, el protocolo o la ruta.


1
Gran respuesta. Todo lo que quería era window.location.hostver si estoy en "stackoverflow.com" o no.
Salyangoz

1
Esto es realmente lo que estaba buscando. Estaba tan atrapado en la mecánica de la extensión que olvidé que puedes tomar la URL de la página con window.location.href.
Felwithe

Esto requiere una match:"<all_urls>"situación en la sección content_script y Chrome no se recomienda <all_urls>.
mcan

@Tahtakafa No, no lo hace. Se supone que ya se está ejecutando un script de contenido (ya sea a través de un permiso de host para esa página o activeTab).
Xan

Asegúrese de ejecutar esto contentScript.jsy no en el background.js. Simplemente pase cualquier información que haya filtrado de la URL al mensaje background.js. Ejemplo: let message = { type: "fetchVideoDate", id: getVideoId() };donde getVideoId()contiene una ejecución de window.location.toString(). De lo contrario, obtendrá algunos chrome://temp_background_file.htmldatos. También tenga en cuenta que a veces messagese llama request.
DavidHulsman

25

El problema es que chrome.tabs.getSelected es asíncrono. Este código a continuación generalmente no funcionará como se esperaba. El valor de 'tablink' seguirá sin definirse cuando se escriba en la consola porque getSelected aún no ha invocado la devolución de llamada que restablece el valor:

var tablink;
chrome.tabs.getSelected(null,function(tab) {
    tablink = tab.url;
});
console.log(tablink);

La solución es envolver el código donde usará el valor en una función y hacer que se invoca getSelected. De esta manera, se garantiza que siempre tendrá un valor establecido, ya que su código tendrá que esperar a que se proporcione el valor antes de ejecutarse.

Intenta algo como:

chrome.tabs.getSelected(null, function(tab) {
    myFunction(tab.url);
});

function myFunction(tablink) {
  // do stuff here
  console.log(tablink);
}

Gracias por el código, esto funcionó para mí, se deben agregar "pestañas" a los permisos en el archivo manifest.json "permisos": ["pestañas"]
Doug Molineux

También esto funciona a las
mil maravillas

Y cómo obtener enlaces de todas las pestañas abiertas
Enve

2
Intenté esto, pero la URL no está definida ¿por qué es esto?
nnm

1

Hola, aquí hay una muestra de Google Chrome que envía por correo electrónico el sitio actual a un amigo. La idea básica detrás es lo que quieres ... en primer lugar, busca el contenido de la página (no es interesante para ti) ... luego obtiene la URL (<- buena parte)

Además, es un buen ejemplo de código de trabajo, que prefiero con mucho entusiasmo a leer Documentos.

Se puede encontrar aquí: envíe esta página por correo electrónico


1

Esta solución ya está PROBADA.

establecer permisos para API en manifest.json

"permissions": [ ...
   "tabs",
    "activeTab",
    "<all_urls>"
]

En la primera carga llama a la función. https://developer.chrome.com/extensions/tabs#event-onActivated

chrome.tabs.onActivated.addListener((activeInfo) => {  
  sendCurrentUrl()
})

En función de cambio de llamada. https://developer.chrome.com/extensions/tabs#event-onSelectionChanged

chrome.tabs.onSelectionChanged.addListener(() => {
  sendCurrentUrl()
})

la función para obtener la URL

function sendCurrentUrl() {
  chrome.tabs.getSelected(null, function(tab) {
    var tablink = tab.url
    console.log(tablink)
  })


-2

Tienes que verificar esto .

HTML

<button id="saveActionId"> Save </button>

manifest.json

  "permissions": [
    "activeTab",
    "tabs"
   ]

JavaScript
El siguiente código guardará todas las URL de la ventana activa en el objeto JSON como parte del clic del botón.

var saveActionButton = document.getElementById('saveActionId');
saveActionButton.addEventListener('click', function() {
    myArray = [];
    chrome.tabs.query({"currentWindow": true},  //{"windowId": targetWindow.id, "index": tabPosition});
    function (array_of_Tabs) {  //Tab tab
        arrayLength = array_of_Tabs.length;
        //alert(arrayLength);
        for (var i = 0; i < arrayLength; i++) {
            myArray.push(array_of_Tabs[i].url);
        }
        obj = JSON.parse(JSON.stringify(myArray));
    });
}, false);

Mi extensión de Chrome para guardar URL en ventanas activas es chrome.google.com/webstore/detail/tabstore-plugin/…
Kanagavelu Sugumar
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.