javascript - 在每个鼠标事件性能上运行代码

标签 javascript

在我的应用程序中,我设置了每次鼠标移动时发生的鼠标事件。记录它看起来像这样:

enter image description here

每次鼠标移动时,都会创建这些实例,因此当用户使用该组件时,可能会发生数千甚至数万个此类实例。

然后我必须在每个事件上运行一些代码才能获得我想要的功能:

  let paths = e.path.map(x => {
    return x.className;
  })

  console.log(paths);

  if (paths.includes('gantt_grid')) {
    // console.log('includes');
  }

得到以下结果:

enter image description here

我的功能可以正常工作,但我的问题是,这将如何提高性能?它似乎并没有减慢速度,但我确信这是不好的做法。绘制成千上万次 map 对我来说似乎并不好。浏览器能够处理这个问题吗?

如果这很糟糕,是否有其他方法可以在 JS 或 Angular 中做到这一点?

最佳答案

它现在可能不会减慢速度,具体取决于您的事件处理程序以及您正在计算的内容。但是,如果您执行一些繁重的工作(例如 DOM 操作),它确实会减慢您的应用程序,因为它会填满主线程。

使用像 lodash throttle 这样的东西或debounce 。很多时候您不需要触发如此多的事件。

一个小例子:

const g = (id) => document.getElementById(id);
const handler = (e) => e.target.innerText = JSON.stringify({
  x: e.clientX,
  y: e.clientY
})

g('regular').addEventListener('mousemove', handler);
g('throttle').addEventListener('mousemove', _.throttle(handler, 1000));
g('debounce').addEventListener('mousemove', _.debounce(handler, 1000));
main div {
  width: 150px;
  height: 50px;
  margin: 10px;
  background: lightblue;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

<main>
  <div id="regular"></div>
  <div id="throttle"></div>
  <div id="debounce"></div>
</main>

您可以传递更多选项,以便您可以确保在事件开始和结束时调用您的事件处理程序。通过debounce,您甚至可以模拟throttle本身。

关于javascript - 在每个鼠标事件性能上运行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53186300/

相关文章:

javascript - 如何计算图像大小以适合页眉下方和页脚上方

javascript 和 extJs - 范围问题

javascript - 如何获取图像的图像高度以设置另一个div高度

javascript - HTML 注释标签中的 Javascript 是否仍应为 "hidden"?

javascript - 使用 VPN 时可以使用 jquery CDN 吗? - 使用 TamperMonkey

javascript - 在 JavaScript 中,如何更改任何对象的 JSON.stringify 的默认输出

使用 Promise 实现 JavaScript Scheduler

javascript - 如何使用 PHP 和 JS 将文本复制到剪贴板?

javascript - 谷歌关闭 - 触发表单提交

javascript - 在 jQuery 中的下拉选择上显示警报对话框