如果函数获得新值

时间:2015-08-21 17:18:32

标签: javascript function settimeout

我的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' listener附加到具有不同值的按钮。因此,如果用户单击另一个具有不同值的按钮,则当前功能仍在执行中。我想运行函数doneEditDel如果' onmousedown'具有其他值的侦听器执行

4 个答案:

答案 0 :(得分:0)

如果我理解正确,您想要取消在down功能中创建的计时器。如果是这样,您需要使doneEditDel函数可以访问计时器变量,例如,使其成为全局变量。然后,您可以通过在doneEditDel中调用clearTimeout(mousedown_timer)来清除计时器。

答案 1 :(得分:0)

存储先前的值并在您的向下功能中进行检查

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);

答案 2 :(得分:0)

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);

}

经过一些艰难的时间,从上面的代码的想法..我解决了它..谢谢伙伴:)

答案 3 :(得分:0)

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

请参阅引用文章中使用debounce实现的代码段。单击A并等待2秒,它将隐藏。在2秒内单击A然后B,B将在2秒后隐藏:

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)" />