Задержка перед отправкой ajax-запроса не работает - PullRequest
0 голосов
/ 10 июля 2011

Когда я держу курсор над <td>, он ждет 900 миллисекунд, а затем отправляет много запросов (я всегда нахожу больше tds за эти 900 мс). Что я делаю неправильно? почему работает только clearTimeout (с комментариями)?

Моя точка зрения заключается в том, чтобы подождать, прежде чем нажать на сервер, и если пользователь переместит мышь на другое <td> в этом текущем обратном отсчете (900 мс), предыдущий обратный отсчет будет прерван, а новый произойдет

        $(function(){
                var isLoading = false;
                $("td").hover(function(){
                        var x = parseInt(0);
                        var position = $(this).attr('id');
                        clearTimeout(timer);
                        var oID = $(this).attr('id');
                        var oData = $(this);
                        var timer = setTimeout(function(){
                                if (position == oID&&!isLoading)
                                {
                                        clearTimeout(timer);
                                        $.ajax({
                                                beforeSend: function(xhr){ var isLoading = true; },
                                                url: 'ajax.php?what=click&position='+position,
                                                success: function(data){
                                                        $('#hovercard').css(oData.offset());
                                                        $('#hovercard').show();
                                                        $('#hovercard').html(data);
                                                }
                                        });
                                }
                        }, 900);
// this only works ->                                             clearTimeout(timer);
                });
        });

1 Ответ

1 голос
/ 10 июля 2011

Вам нужно будет хранить timer в области видимости вне функции наведения. Я не очень уверен насчет области для isLoading, поэтому, если это не сработает, попробуйте переместить isLoading в ту же область, что и timer:

    var timer;
    $(function(){
            var isLoading = false;
            $("td").hover(function(){
                    var x = parseInt(0);
                    var position = $(this).attr('id');
                    clearTimeout(timer);
                    var oID = $(this).attr('id');
                    var oData = $(this);
                    timer = setTimeout(function(){
                        if (position == oID&&!isLoading)
                        {
                                clearTimeout(timer);
                                $.ajax({
                                        beforeSend: function(xhr){ isLoading = true; },
                                        url: 'ajax.php?what=click&position='+position,
                                        success: function(data){
                                                    $('#hovercard').css(oData.offset());
                                                    $('#hovercard').show();
                                                    $('#hovercard').html(data);
                                        }
                                });
                        }
                   }, 900);
           });
   });

У тебя есть и другие странности. Обратите внимание, что oID всегда будет равен позиции, поскольку они установлены в одно и то же время в одной и той же области видимости. Это делает первое условие в вашем условии if бессмысленным. Я также удалил оператор var в вашей функции beforeSend.

...