如果函数获得新值,则停止该函数

Stop a function if the function got new value

我的 javascript 功能需要帮助

如果用户单击具有此事件侦听器的元素...

onmousedown="down('+j+')"

此函数接收 'j' 作为回调...

function down(j) {
mousedown = true;
mousedown_timer = setTimeout(function () {
    if(mousedown) {
        $('#del'+j).show();
        $('#ed'+j).show();
        $('#clock'+j).hide();
        $('#doneButton'+j).show();
        navigator.vibrate(50);
    }
}, 300);

}

如果 'j' 的值已更改,我正在尝试 运行 此函数...

function doneEditDel(d){
$('#doneButton'+d).hide();
$('#del'+d).hide();
$('#ed'+d).hide();
$('#clock'+d).show();
}

'onmousedown' 侦听器附加到具有不同值的按钮。因此,如果用户单击另一个具有不同值的按钮,则当前功能仍在执行。我想要 运行 function doneEditDel if 'onmousedown' listener with the other value execute

如果我没理解错的话,你想取消你在 down 函数中创建的定时器。如果是这样,您需要通过使其成为全局变量来使 doneEditDel 函数可以访问计时器变量。然后,您可以通过在 doneEditDel.

中调用 clearTimeout(mousedown_timer) 来清除计时器

存储之前的值并在你的向下函数中检查它

var prevJ = null;

function down(j) {
if(prevJ !== null && prevj !== j) {
  clearTimeout(mousedown_timer);
  doneEditDel(j) // I think that is what you wanted to happen
  return;
}
prevJ = j;

mousedown = true;
mousedown_timer = setTimeout(function () {
    if(mousedown) {
        $('#del'+j).show();
        $('#ed'+j).show();
        $('#clock'+j).hide();
        $('#doneButton'+j).show();
        navigator.vibrate(50);
    }
}, 300);
var prevJ = null;

function down(j) {
if(prevJ !== null && prevJ !== j) {
doneEditDel(prevJ); // I think that is what you wanted to happen
}
prevJ = j;
mousedown = true;
mousedown_timer = setTimeout(function () {
    if(mousedown) {
        $('#del'+j).show();
        $('#ed'+j).show();
        $('#clock'+j).hide();
        $('#doneButton'+j).show();
        navigator.vibrate(50);

    }
}, 300);

}

经过上面代码的一些困难之后..我解决了它..谢谢伙伴:)

您可以通过 debouncingdown() 功能一起避免这个问题。如果在指定的时间范围内再次调用该函数,这将有效地取消对该函数的先前调用。

请参阅参考文章中使用去抖实现的代码段。单击 A 并等待 2 秒,它将隐藏。 2秒内点击A再点击B,2秒后B会隐藏:

function down(event) {
  //no need for timeout
  $(event.target).hide();
}

var debouncedDown = debounce(down, 2000); //create instance to use across handlers

function debounce(func, wait, immediate) {
  var timeout;
  return function() {
    var context = this,
      args = arguments;
    var later = function() {
      timeout = null;
      if (!immediate) func.apply(context, args);
    };
    var callNow = immediate && !timeout;
    clearTimeout(timeout);
    timeout = setTimeout(later, wait);
    if (callNow) func.apply(context, args);
  };
};
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="button" value="Button A" id="button-a" onmousedown="debouncedDown(event)" />
<input type="button" value="Button B" id="button-b" onmousedown="debouncedDown(event)" />