2011-05-27 88 views
0

实际上我找不到这个问题的确切标题。但我可以形容它,以便你知道我需要什么。 说我有一个按钮#pressme,我想绑定一个点击事件处理程序。在函数处理程序内部,我将使用ajax从服务器获取一些数据,然后解析数据以更新div#状态的文本,例如:从N/A更新/未更新。由于数据总是在变化,我想添加另一个函数来将div#状态更改回N/A。 这里是我想出这个目的:jquery队列事件?

$("button#pressme").bind("click", function(){ 
      $.ajax{(
        type:"POST", 
        ..... 
        success: function (xml, status) { 
        ..... 
        $("div#status").text("updated"); 
        setTimeout(function(){$("div#status").text("N/A")}, 20000); 
        }, 
        error: .... 
       )}; 
    }); 

这似乎工作,我的计划,因为该文本将在20秒后变回“N/A”。但是,我发现存在一个问题:如果用户不断点击按钮:说用户单击按钮1st将文本更改为“更新”,然后在18秒后再次单击以将文本更改为“未更新”。然后,仅在2秒后,文本将变回“N/A”,因为第一个setTimeout函数已执行。

如果我想记住上次用户点击,并且只在用户最后一次点击后20秒更新div的文本?如何轻松实现这一点?

谢谢!

回答

1
  1. 保留的句柄定时器:

    每次重新启动定时器时间timerId = setTimeout(...);

  2. ,清除旧第一

    clearTimeout(timerId);

例如为:

$("button#pressme").bind("click", function() { 
     var that = this; 
     $.ajax{(
       type:"POST", 
       ..... 
       success: function (xml, status) { 
       var timerId = $(that).data('timerId'); 
       ..... 
       $("div#status").text("updated"); 
       if (timerId) { 
        clearTimeout(timerId); 
       } 
       timerId = setTimeout(function(){$("div#status").text("N/A")}, 20000); 
       $(that).data('timerId', timerId) 
       }, 
       error: .... 
      )}; 
    }); 

EDIT更新使用jQuery .data()方法来存储和每个元件的基础上检索的timerId显现。

+0

不,它不起作用。似乎每次用户单击该按钮时,timerId都会重置为空。我没有把上面的代码放在$(function(){....})中,是不是timerId应该存在于这个闭包中?我现在很困惑。 – WilliamLou 2011-05-27 23:10:41

+0

是的,你是对的 - timerId应该已经被声明在绑定函数之外了! – Alnitak 2011-05-28 00:03:32

+0

为了使这项工作,你必须将var timeId = null移出单击函数处理程序。只是试图编辑您的帖子 – WilliamLou 2011-05-28 00:11:24