将所有 onclick 更改为事件侦听器

Posted

技术标签:

【中文标题】将所有 onclick 更改为事件侦听器【英文标题】:Change all onclick to event listeners 【发布时间】:2021-10-19 23:47:54 【问题描述】:

我们最近在我们的软件中引入了 nonce 内容安全策略。问题是我们有数百个 html 元素通过 onclick 事件执行内联 javascript,我们不想再接受“unsafe-inline”了。

有什么方法可以从带有onclick 属性集的页面中获取所有元素,阅读他们执行它的代码并添加类似的内容

$(element).click(function()
   doAction();
);

【问题讨论】:

【参考方案1】:

onclick 属性在您的 JS 中的任何其他点击事件处理程序之前执行。

function doSomething() 
  console.log('I do something')


var allElements = document.getElementsByTagName('*');
for (var i = 0; i < allElements.length; i++) 
  if (typeof allElements[i].onclick === 'function') 
    allElements[i].addEventListener("click", function(e) 
      console.log('Before I do something');
    );
  
&lt;div onclick="doSomething()"&gt;Click me to doSomething&lt;/div&gt;

一个技巧解决方法是做这样的事情:

function doSomething() 
  console.log('I do something')


var allElements = document.getElementsByTagName('*');
for (var i = 0; i < allElements.length; i++) 
  if (typeof allElements[i].onclick === 'function') 
    allElements[i].addEventListener("mousedown", function(e) 
      console.log('Before I do something');
    );
  
&lt;div onclick="doSomething()"&gt;Click me to doSomething&lt;/div&gt;

【讨论】:

以上是关于将所有 onclick 更改为事件侦听器的主要内容,如果未能解决你的问题,请参考以下文章

添加处理程序到文档事件将范围更改为 Sencha Touch 中的文档

按钮 onClick 事件侦听器在 Electron 应用程序中不起作用

是否可以将 onclick 侦听器添加到 QCheckBox?

<a> 的父级事件冒泡,从 onclick 事件侦听器返回 false

Google Maps v2 - onclick 监听器在方向更改后没有响应

使用 jQuery,为单选按钮设置 onClick 事件侦听器的最佳方法是啥?