Search code examples
jqueryajaxtimeoutdelay

Add delay before sending new ajax request using jQuery


I have a list of links which point to html pages.

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

And I have a JavaScript(jQuery) which receives and appends the html to my document.

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

I've tried to work with setTimeout() but it does not work as I expected.

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

How can I tell jQuery to wait (500ms or 1000ms or …) on hover before sending the new request?


Solution

  • I think that perhaps instead of aborting the request, you should control the ajax requests with a variable, for example, called processing=false, that would be reset to false, in the success/error function. Then you would only execute the function in setTimeout, if processing was false.

    Something like:

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