No se puede leer la propiedad ‘onClicked’ de undefined cuando se usa chrome.action o chrome.browserAction

4 minutos de lectura

Avatar de usuario de Alon Mahl
alon mahl

Estoy escribiendo una extensión de Chrome que me redirigirá a una URL al hacer clic en el ícono de acción del navegador.

Estoy tratando de usar:

chrome.browserAction.onClicked.addListener

pero lo consigo

TypeError no capturado: no se puede leer la propiedad ‘onClicked’ de indefinido

Este es mi archivo de manifiesto:

{
    "name": "first extension",
    "version": "2.2.12",
    "description": "redirct to a link icon",
    "browser_action": {
        "default_icon": "icontest.png",
        "default_title": "Do action"
    },
    "permissions": ["tabs", "http://*/*"],
    "content_scripts": [{
        "matches": ["http://*.twitter.com/*", "https://*.twitter.com/*"],
        "js": ["twterland.js"]
    }],
    "icons": {
        "16": "icontest.png",
        "48": "icontest.png",
        "128": "icontest.png"
    }
}

Este es mi archivo js:

chrome.browserAction.onClicked.addListener(function(tab) { alert("hi"); });

Avatar de usuario de Kirill Oficerov
Cirilo Oficerov

ManifiestoV3

manifiesto.json: agregar action (no browser_action), véase también el guía de migración.

  "action": {},
  "background": {"service_worker": "background.js"},

fondo.js: usar chrome.action no chrome.browserAction.

Manifiesto clásico V2

Para aquellos que ya han agregado algo como

"background": {
    "scripts": ["background.js"]
}

y todavía consigue Cannot read property 'onClicked' of undefined – solo agrega

"browser_action": {}

en su manifest.json

  • Este es en realidad mi problema. Mi guión ya estaba en segundo plano. Es solo que nunca he declarado ninguna browser_action para empezar.

    – Lucas Vo

    11 de febrero de 2017 a las 7:32

  • "browser_action": {} es suficiente

    – Pacerier

    7 de agosto de 2017 a las 15:34

  • ¿¿¿¿¿¿¿¿¿Por qué????????? Esto no tiene sentido… Cambié el icono a otro archivo y no se pudo ejecutar. ¡Lo cambio de nuevo a icon.png y todo está bien! Gracias, pero realmente me estoy rascando la cabeza…

    – birwin

    6 sep 2017 a las 21:49

  • Lo mismo para page_action

    – Illidan

    1 de marzo de 2021 a las 16:04

  • esto no funcionaría si la versión del manifiesto es 3

    –Yash Kumar Verma

    26 de diciembre de 2021 a las 4:05

Avatar de usuario de Derek 朕會功夫
Derek 朕會功夫

Parece que el código está en tu twterland.js archivo, que es su secuencia de comandos de contenido. browserAction solo se puede usar en páginas de extensión, por lo que no puede usarlo en scripts de contenido.

Documento: https://developer.chrome.com/extensions/content_scripts

Sin embargo, los scripts de contenido tienen algunas limitaciones. Ellos no pueden:
Utilice Chrome.* API (excepto para partes de chrome.extension)
– Usar variables o funciones definidas por las páginas de su extensión
– Usar variables o funciones definidas por páginas web o por otros scripts de contenido

ponlo en el pagina de fondo en cambio.

  • El enlace a la “página de fondo” está muerto.

    – Philippe-André Lorin

    13 de julio de 2022 a las 10:42

Si no tienes un "browser_action" propiedad definida en su manifest.json entonces este error puede ocurrir. La respuesta de @Kirill funciona, pero también debe agregar un espacio en blanco icon.png archivo de lo contrario, Chrome arrojará un error de que no puede encontrar dicho archivo.

Agregando esto a la manifest.json archivo debería suprimir este es un error:

"browser_action": {}

Asegúrese de leer el documentación para mayor referencia sobre cómo usar el "browser_action" configuración.

  • Tengo browser_action definido en mi manifiesto, todavía chrome.pageAction no está definido en mi script de fondo

    – Alejandro Mills

    8 de enero de 2018 a las 19:54


  • @AlexanderMills La pregunta original era sobre chrome.browserAction así que no estoy seguro de pageAction.

    – Señal

    08/01/2018 a las 20:15

  • También tuve que quitar y reinstalar la extensión.

    – Evanss

    8 de enero de 2021 a las 15:24

El mismo problema puede aparecer si está utilizando manifest_version 3. En este caso

  • “background.scripts” debe reemplazarse por “background.service_worker”
  • “browser_action” debe reemplazarse por “acción”
  • en el código js, ​​chrome.browserAction debe reemplazarse con chrome.action

la información detallada se puede encontrar aquí: Documentación de migración de la versión 3 del manifiesto

También estaba recibiendo esto, agregando

"persistent": true 

a mi declaración de antecedentes en manifest.json lo resolvió.

  • Si bien esto “resuelve” la situación, aparentemente hay bastantes razones no tener "persistent": truepor lo que no es una solución ideal.

    – Anton Of The Woods

    18 de septiembre de 2020 a las 8:31

  • Tenga en cuenta que si su extensión de Chrome usa la Versión 3 en el Manifiesto, esta característica no existirá.

    –Raleigh L.

    10 de enero de 2022 a las 23:44

Avatar de usuario de HasanAboShally
HasanAboShally

Tenga en cuenta que sólo puede lanzar uno de app, browser_action, page_actions presente en su archivo manifest‎.json.

Por ejemplo, para usar el chrome.browserAction.setBadgeText deberías tener el browser_action campo en su manifest‎.json.

  • Si bien esto “resuelve” la situación, aparentemente hay bastantes razones no tener "persistent": truepor lo que no es una solución ideal.

    – Anton Of The Woods

    18 de septiembre de 2020 a las 8:31

  • Tenga en cuenta que si su extensión de Chrome usa la Versión 3 en el Manifiesto, esta característica no existirá.

    –Raleigh L.

    10 de enero de 2022 a las 23:44

Avatar de usuario de Vinayak Bansal
Vinayak Bansal

Asegúrese de que no tengamos jquery.js antes de background.js en la matriz de scripts de background en manifest.json.

"background": {
    "scripts": ["background.js","jquery.js"]
}

¿Ha sido útil esta solución?