【问题标题】:Trigger a function only once inside a continously triggered function在连续触发的函数中只触发一次函数
【发布时间】:2016-01-15 11:35:58
【问题描述】:

我有一个函数,当鼠标指针悬停在图像上时,它会在每次按下鼠标事件时触发。 现在,我在这个鼠标按下函数中调用了两个函数。

我需要每次调用一个函数Triangulate(),而另一个函数ImageCalculation()只在最后一次调用。

此处仅表示最后一次,连续的img_mouse_down() 函数调用之间应存在至少 3 秒或更长时间的间隔。

下面是我的代码:

function img_mouse_down(){
  if(leftMouseButton){
    Triangulate(); //Call this function every time.
    ImageCalculation(); //Call this function only the last time
  }
}

如果我连续点击图片 5 次然后暂停 3 秒或更长时间,Triangulate() 应该被调用 5 次,ImageCalculation() 应该只被调用一次。

如何做到这一点?

【问题讨论】:

  • 暂停3秒后可以调用ImageCalculation()吗?
  • 仅供参考,这称为事件去抖动
  • @yoavmatchulsky:是的。得到了解决方案。感谢您的努力。

标签: javascript jquery


【解决方案1】:
var glob_timeout_holder;
function img_mouse_down(){
  if(leftMouseButton){
    Triangulate(); //Call this function every time.

    clearTimeout(glob_timeout_holder); //clear if any previous continuing timeouts

    glob_timeout_holder = setTimeout(ImageCalculationlast, 3000);
  }
}

据我所知,这可能会对您有所帮助。每次运行 img_mouse_down() 时,它都会设置执行 ImageCalculation() 的超时时间,但在此之前会杀死任何以前的 timeOuts,结果是,如果用户停止单击,ImageCalculation() 将在最后一次单击后 3 秒后调用一次。

【讨论】:

  • 感谢您的回复 Kemal Dağ。但不知何故,每次都调用 ImageCalculationlast()。考克斯的回答对我有用。想法是一样的,但他初始化为 null 并在清除之前检查 not null。
【解决方案2】:

类似的东西应该可以解决您的问题。每次调用都会清除超时,否则会在 3 秒后触发 ImageCalculation。

var timer = null
function img_mouse_down () {
    if(leftMouseButton){
    Triangulate();
    if (timer !== null) {
        clearTimeout(timer)
    }
    timer = setTimeout(function () {
        ImageCalculation()
    }, 3000)
  }
}

【讨论】:

  • 感谢考克斯的回复。标记为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多