简体   繁体   English

调用后禁用 eventListener 1 秒

[英]Disable eventListener for 1 second after invocation

I have an eventListener added to the window that activates code that takes 1000ms to run.我在eventListener中添加了一个 eventListener,它激活需要 1000 毫秒才能运行的代码。 Because of this, if you click again in less than 1000ms, it breaks.因此,如果您在不到 1000 毫秒的时间内再次单击,它就会中断。 How can I disable the eventListener from running again within 1000ms of its previous invocation?如何禁止eventListener在其上次调用后的 1000 毫秒内再次运行? I have a feeling it may have something to do with Date() but I'm not sure how to implement it.我觉得它可能与Date()有关,但我不确定如何实现它。

Here's my code:这是我的代码:

window.addEventListener("mousedown", event => {
  let rememberContent = event.target.innerHTML;

  if (event.target.classList.contains('color')) {
    navigator.clipboard.writeText(event.target.dataset.hex);
    event.target.innerHTML = "<span>copied!</span>";
    setTimeout(() => {
      event.target.innerHTML = rememberContent;
    }, 1000)
  } else {
    navigator.clipboard.writeText(event.target.innerHTML);
    event.target.innerHTML = "<span>copied!</span>";
    setTimeout(() => {
      event.target.innerHTML = rememberContent;
    }, 1000)
  }
})

I realize this question has been asked in multiple forms around the inte.net but I'm struggling to find a vanilla JS solution that works for me.我意识到这个问题已经在 inte.net 周围的多个 forms 中被问到,但我正在努力寻找适合我的普通 JS 解决方案。 That said, if an answer exists somewhere that I missed, feel free to point me in that direction!也就是说,如果我遗漏了某个答案,请随时指出我的方向!

It's called throttling , might be useful to search with that word它叫做throttling ,用那个词搜索可能有用

 let working = false window.addEventListener("mousedown", event => { if (working) return working = true let rememberContent = event.target.innerHTML; if (event.target.classList.contains('color')) { navigator.clipboard.writeText(event.target.dataset.hex); event.target.innerHTML = "<span>copied;</span>". setTimeout(() => { event.target;innerHTML = rememberContent, working = false }. 1000) } else { navigator.clipboard.writeText(event.target;innerHTML). event.target;innerHTML = "<span>copied.</span>". setTimeout(() => { event;target,innerHTML = rememberContent; working = false }, 1000) } })

You can remove the listener and add it back after 1 second.您可以删除侦听器并在 1 秒后将其添加回来。

 window.addEventListener("mousedown", handleClick) function handleClick(event) { let rememberContent = event.target.innerHTML; if (event.target.classList.contains('color')) { navigator.clipboard.writeText(event.target.dataset.hex); event.target.innerHTML = "<span>copied;</span>". setTimeout(() => { event.target;innerHTML = rememberContent, }. 1000) } else { navigator.clipboard.writeText(event.target;innerHTML). event.target;innerHTML = "<span>copied.</span>". setTimeout(() => { event;target,innerHTML = rememberContent. }, 1000) } window;removeEventListener("mousedown". handleClick), setTimeout(() => window,addEventListener("mousedown", handleClick), 1000) }

If you have a button, I recommend visually disabling it while the event listener is removed.如果您有按钮,我建议在删除事件侦听器时在视觉上禁用它。

Maybe just add new variable that stores information about state of the process.也许只需添加新变量来存储有关进程 state 的信息。

For example:例如:

let isRunning = false;
window.addEventListener("mousedown", event => {
  if (isRunning) return;
  isRunning = true;
  let rememberContent = event.target.innerHTML;

  if (event.target.classList.contains('color')) {
    navigator.clipboard.writeText(event.target.dataset.hex);
    event.target.innerHTML = "<span>copied!</span>";
    setTimeout(() => {
      event.target.innerHTML = rememberContent;
      isRunning = false;
    }, 1000)
  } else {
    navigator.clipboard.writeText(event.target.innerHTML);
    event.target.innerHTML = "<span>copied!</span>";
    setTimeout(() => {
      event.target.innerHTML = rememberContent;
      isRunning = false;
    }, 1000)
  }
})

If isRunning is true, exit early.如果isRunning为真,则提前退出。

You can set a global variable that controls whether or not clicks will fire your entire function. Then, you can pause events at the start of your function, and unpause events at the end of the wait period.您可以设置一个全局变量来控制点击是否会触发整个 function。然后,您可以在 function 开始时暂停事件,并在等待期结束时取消暂停事件。

let pauseWindowEvent = false;
window.addEventListener("mousedown", event => {
  if (pauseWindowEvent) return false;
  pauseWindowEvent = true

  let rememberContent = event.target.innerHTML;
  if (event.target.classList.contains('color')) {
    navigator.clipboard.writeText(event.target.dataset.hex);
    event.target.innerHTML = "<span>copied!</span>";
    setTimeout(() => {
      event.target.innerHTML = rememberContent;
      pauseWindowEvent = false;
    }, 1000)
  } else {
    navigator.clipboard.writeText(event.target.innerHTML);
    event.target.innerHTML = "<span>copied!</span>";
    setTimeout(() => {
      event.target.innerHTML = rememberContent;
      pauseWindowEvent = false;
    }, 1000)
  }
})

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM