在使用jquery发送新的ajax请求之前添加延迟

时间:2010-10-19 21:26:25

标签: jquery ajax timeout delay

我有一个指向html页面的链接列表。

<ul id="item-list">
    <li><a href="assets/data/item1.html">Item 1</a></li> 
    <li><a href="assets/data/item2.html">Item 2</a></li>
    <li><a href="assets/data/item3.html">Item 3</a></li>
    <li><a href="assets/data/item3.html">Item 4</a></li>
</ul>

我有一个javascript(jquery),并且将html附加到我的文档中。

var request;
$('#item-list a').live('mouseover', function(event) {
    if (request)
        request.abort();
        request = null;

    request = $.ajax({
        url: $(this).attr('href'),
        type: 'POST',
        success: function(data) {
            $('body').append('<div>'+ data +'</div>')
        }
    });
});

我尝试过使用setTimeout(),但它没有像我想象的那样工作。

    var request, timeout;
$('#item-list a').live('mouseover', function(event) {
    timeout = setTimeout(function(){
        if (request)
            request.abort();
            request = null;

        request = $.ajax({
            url: $(this).attr('href'),
            type: 'POST',
            success: function(data) {
                $('body').append('<div>'+ data +'</div>')
            }
           });
        }, 2000
    );
});

如何在发送新请求之前告诉jquery在悬停时等待(500ms或1000ms或...)?

4 个答案:

答案 0 :(得分:8)

我认为,或许不是中止请求,您应该使用变量控制ajax请求,例如,名为 processing=false ,这将被重置为false,成功/错误功能。 然后你只能在setTimeout中执行该函数,如果处理是假的。

类似的东西:

var request, timeout;
var processing=false;
$('#item-list a').live('mouseover', function(event) {
  timeout = setTimeout(function() {
    if (!processing) {
      processing=true;
      request = $.ajax({
        url: $(this).attr('href'),
        type: 'POST',
        success: function(data) {
          processing=false;
          $('body').append('<div>'+ data +'</div>')
        }
      });
    }
  }, 2000);
});

答案 1 :(得分:2)

$.fn.extend( {
        delayedAjax: function() {
          setTimeout ($.ajax, 1000 );
        }
});

  $.fn.delayedAjax();

似乎工作但可能不是最漂亮的解决方案。此外,您需要添加一些代码来传递args&amp;如果你想要

的超时值

答案 2 :(得分:2)

如果你愿意,你需要有一个可以作为倒数计时器的变量,鼠标输出事件也会被取消......

$(function(){
  $("#item-list a").live("mouseover",function(){
    var a = $(this);
    a.data("hovering","1");
    setTimeout(function(){
        if (a.data("hovering") == "1") {
            // this would actually be your ajax call
            alert(a.text());
        }
    }, 2000);
  });
  $("#item-list a").live("mouseout",function(){
    $(this).data("hovering","0");
  });
});

答案 3 :(得分:-2)

这适合我...

$(show_id).animate({
  opacity: 0
}, 5000, function() {
  $(show_id).html(data)
});