2010-10-19 17 views
7

Mam listę linków, które wskazują strony html.Dodaj opóźnienie przed wysłaniem nowego żądania ajax za pomocą jquery

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

i mam javascript (jQuery) recives Wich i dołączyć do mojego dokumentu 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>') 
     } 
    }); 
}); 

Próbowałem już pracować z funkcją setTimeout(), ale nie działa ona zgodnie z założeniami.

Jak mogę nakazać jQuery czekać (500ms lub 1000ms lub ...) po najechaniu kursorem przed wysłaniem nowego żądania?

+1

mam rację sądząc, chcesz, aby wniosek tylko wtedy, gdy użytkownik najedzie na odnośnik na dłużej niż 2 sekundy? – lonesomeday

+0

lonesomeday masz rację. – gearsdigital

Odpowiedz

8

myślę, że być może zamiast przerywania wniosek, należy kontrolować Ajax żądań ze zmienną, na przykład, o nazwie processing=false, który byłby ustawiony na false, w funkcji sukcesu/błędu. Następnie można wykonać tylko funkcję w setTimeout, jeśli przetwarzanie było fałszywe.

Coś jak:

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

Edytowałem to, aby dać ci przykład. – netadictos

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

    $.fn.delayedAjax(); 

wydaje się działać, ale prawdopodobnie nie najładniejszym rozwiązaniem. Musisz też dodać kod, aby przekazać argumenty o wartości timeout val, jeśli chcesz

2

Musisz mieć zmienną, która może działać w trybie odliczającym, jeśli chcesz, że zdarzenie mouseout również zostanie anulowane. .

$(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"); 
    }); 
}); 
-2

działa to dla mnie ...

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

Dzięki za propozycję. Polecam: 1. Wyjaśnij dalej swoją odpowiedź i 2. Przywiąż ją do pierwotnego pytania. Po pierwsze, jestem zaskoczony widząc, że korzystasz z animacji jQuery - czy sugerujesz, że musisz animować w interfejsie użytkownika, aby osiągnąć wynik? Po drugie, czy nie powinno być połączenia ajax? –

Powiązane problemy