Javascript 如何取消延迟删除DOM元素

Javascript 如何取消延迟删除DOM元素,javascript,jquery,settimeout,Javascript,Jquery,Settimeout,我试图在延迟后删除DOM元素。我还希望通过用户单击(如果他们在计时器到期前单击)来取消此删除。这是我的: 删除我! 很明显,我只是展示了相关的来源 $("div.delete").click(function() { var element = $(this), timeout = element.attr('data-timeout'); if (timeout) { clearTimeout(timeout); element.

我试图在延迟后删除DOM元素。我还希望通过用户单击(如果他们在计时器到期前单击)来取消此删除。这是我的:

删除我!

很明显,我只是展示了相关的来源

$("div.delete").click(function() {
    var element = $(this),
        timeout = element.attr('data-timeout');
    if (timeout) {
        clearTimeout(timeout);
        element.removeAttr('data-timeout');
        element.text("Delete me!");
    } else {
        timeout = setTimeout(function() {
            element.remove();
            alert('Sniff, too late!');
        }, 2000);
        element.attr('data-timeout', timeout);
        element.text("Save me!");
    }
});
这很有效!我的问题

  • 有更好的方法吗?我的第一次失败尝试有多个处理程序
  • 为什么它不能在Javascript 1.7中工作

  • 超时设置为全局设置,并在用户单击时将其清除

    clearTimeout(timeout);
    

    您需要在处理程序外部定义
    timeout

    var timeout;
    $("div.delete").click(function() {
        var element = $(this);
        if (timeout) {
            clearTimeout(timeout);
            timeout = undefined;
            element.text("Delete me!");
        } else {
            timeout = setTimeout(function() {
                element.remove();
                alert('Sniff, too late!');
            }, 2000);
            element.text("Save me!");
        }
    });
    

    我建议将代码封装起来,以便在其他函数中添加处理程序,以避免用超时ID混淆全局命名空间。

    它不适用于JavaScript 1.7,因为您使用的浏览器不支持它和/或它的嵌入方式。您的fiddle适用于Firefox


    不要建议将变量设置为全局变量!嗯,这正是我所说的。你只是做了你告诉我不要做的事。好吧,如果是这样的话,请解释一下?+1.为了澄清OP的一点:JS 1.7(以及旧版本中的JS严格模式)不允许通过
    var
    -less变量声明声明全局变量。相反,必须在需要的确切范围内使用
    var
    显式定义
    timeout
    。这甚至无关紧要,问题与代码无关,但javascript版本为1.7