Добавьте задержку перед отправкой нового ajax-запроса с использованием jquery - PullRequest
7 голосов
/ 20 октября 2010

У меня есть список ссылок, которые указывают на 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 ждать (500 мс или 1000 мс или ...) при наведении курсора перед отправкой нового запроса?

Ответы [ 4 ]

8 голосов
/ 20 октября 2010

Я думаю, что, возможно, вместо прерывания запроса вы должны управлять запросами 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);
});
2 голосов
/ 20 октября 2010

Вам понадобится переменная, которая может действовать таймер обратного отсчета, если хотите, событие отмены мыши также отменяется ...

$(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 голосов
/ 20 октября 2010
$.fn.extend( {
        delayedAjax: function() {
          setTimeout ($.ajax, 1000 );
        }
});

  $.fn.delayedAjax();

Кажется, работает, но, вероятно, не самое красивое решение.Кроме того, вам нужно добавить код для передачи аргументов и времени ожидания, если вы хотите

0 голосов
/ 04 сентября 2013

это работает для меня ...

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