Agradeceríamos tu apoyo para compartir nuestros ensayos sobre las ciencias informáticas.
Las extensiones de Chrome no le permiten tener JavaScript en línea (documentación).
Lo mismo ocurre con Firefox WebExtensions (documentación).
Vas a tener que hacer algo similar a esto:
Asignar una identificación al enlace ( se convierte en
), y use
addEventListener
para vincular el evento. Pon lo siguiente en tu popup.js
Archivo:
document.addEventListener('DOMContentLoaded', function()
var link = document.getElementById('link');
// onClick's logic below:
link.addEventListener('click', function()
hellYeah('xxx');
);
);
popup.js
debe cargarse como un archivo de script separado:
Razón
Esto no funciona, porque Chrome prohíbe cualquier tipo de código en línea en extensiones a través de la Política de seguridad de contenido.
No se ejecutará JavaScript en línea. Esta restricción prohíbe tanto en línea
blocks and inline event handlers (e.g.
).
How to detect
If this is indeed the problem, Chrome would produce the following error in the console:
Refused to execute inline script because it violates the following Content Security Policy directive: "script-src 'self' chrome-extension-resource:". Either the 'unsafe-inline' keyword, a hash ('sha256-...'), or a nonce ('nonce-...') is required to enable inline execution.
To access a popup's JavaScript console (which is useful for debug in general), right-click your extension's button and select "Inspect popup" from the context menu.
More information on debugging a popup is available here.
How to fix
One needs to remove all inline JavaScript. There is a guide in Chrome documentation.
Suppose the original looks like:
Click this
One needs to remove the onclick
attribute and give the element a unique id:
Click this
And then attach the listener from a script (which must be in a .js
file, suppose popup.js
):
// Pure JS:
document.addEventListener('DOMContentLoaded', function()
document.getElementById("click-this").addEventListener("click", handler);
);
// The handler also must go in a .js file
function handler()
/* ... */
Note the wrapping in a DOMContentLoaded
event. This ensures that the element exists at the time of execution. Now add the script tag, for instance in the of the document:
Alternativa si está usando jQuery:
// jQuery
$(document).ready(function()
$("#click-this").click(handler);
);
Relajando la política
Q: El error menciona formas de permitir código en línea. No quiero / no puedo cambiar mi código, ¿cómo habilito los scripts en línea?
A: A pesar de lo que dice el error, no puede habilitar secuencia de comandos en línea:
No existe ningún mecanismo para relajar la restricción contra la ejecución de JavaScript en línea. En particular, establecer una política de secuencias de comandos que incluya
'unsafe-inline'
no tendrá ningún efecto.
Actualizar: Desde Chrome 46, es posible incluir en la lista blanca bloques de código en línea específicos:
A partir de Chrome 46, los scripts en línea se pueden incluir en la lista blanca especificando el hash codificado en base64 del código fuente en la política. Este hash debe tener el prefijo del algoritmo hash utilizado (sha256, sha384 o sha512). Consulte el uso de Hash para
elements for an example.
However, I do not readily see a reason to use this, and it will not enable inline attributes like onclick="code"
.
As already mentioned, Chrome Extensions don't allow to have inline JavaScript due to security reasons so you can try this workaround as well.
HTML file
Getting Started Extension's Popup
decir ah
hyhy
popup.js
window.onclick = function(event)
var target = event.target ;
if(target.matches('.clickableBtn'))
var clickedEle = document.activeElement.id ;
var ele = document.getElementById(clickedEle);
alert(ele.text);
O si tiene un archivo Jquery incluido, entonces
window.onclick = function(event)
var target = event.target ;
if(target.matches('.clickableBtn'))
alert($(target).text());
Te invitamos a añadir valor a nuestra información cooperando tu veteranía en las ilustraciones.