2012-03-09 74 views
1

如何使用延迟jQuery函数而不是setTimeout几秒后清除字段消息?下面的代码将立即清除值。清除邮件jQuery延迟setTimeout

var $this = $(this), 
      mid = $this.find("#emid"), 
      contents = $this.find("#equestion");  

    if(contents.length<30){ 
     contents.css('color','red') 
     .val('Error Message') 
     .delay(5000) 
     .val(''); 
     } 
+1

'setTimeout'是这里最好的选择。 – 2012-03-09 16:19:09

+2

你不能。 '.delay'用于动画; 'setTimeout'基本上用于其他任何事情。我确定'.delay'也在内部使用'setTimeout'。 – pimvdb 2012-03-09 16:19:40

回答

4

UPD:其实,你可以简单地使用默认队列和自由连锁效应(如show)和非 - 影响(如val)。只是包装后的queue - dequeue电话:

$("input") 
    .queue(function() { $(this).val("blah").dequeue() }) 
    .delay(1000) 
    .queue(function() { $(this).val("").dequeue() }) 
    .fadeOut(1000) // etc 

http://jsfiddle.net/cA4jB/1/

/UPD

不,你不必(实际上不应该)使用的setTimeout。 jQuery为此提供了一个很好的内置机制,称为queue。其基本思路是这样的:你“收集”功能或延误命名队列:

$(elem).queue("queueName", function(next) { do something and call next() }); 
$(elem).queue("queueName", function(next) { do something else and call next() }); 
$(elem).delay(3000, "queueName"); 
$(elem).queue("queueName", function(next) { do something else and call next() }); 

,然后调用dequeue()开始处理:

$(elem).dequeue("queueName") 

队列中的每个函数被调用一个后另一个,并推迟如预期的工作。

行动中:http://jsfiddle.net/cA4jB/

+0

有趣。我很喜欢这个,很有道理,谢谢。 – Codex73 2012-03-10 02:17:11

+0

@ Codex73:实际上,解决方案更简单。我更新了这篇文章。 – georg 2012-03-11 11:36:55

2

这是一个有点棘手,但你可以创建一个几乎没做什么,与yould明确的价值回调的动画。

if(contents.length<30){ 
    contents.css('color','red') 
     .val('Error Message').animate({ 
      opacity: 1 
     }, 5000, function() { 
      contents.val(''); 
     }); 
} 

的最好方法是仍然使用的setTimeout

4

jQuery文档清楚地提到,

的.delay()方法是最适合的jQuery排队效果 之间延迟。因为它是有限的 - 例如,它不提供一种方式来取消延迟 - .delay()不是替代JavaScript的原生 setTimeout函数,这可能更适合某些使用 的情况。

http://api.jquery.com/delay/

所以,它能够更好地使用setTimeout函数

https://developer.mozilla.org/en/DOM/window.setTimeout