发送ajax请求之前的延迟不起作用

时间:2011-07-09 21:05:04

标签: javascript jquery ajax jquery-hover

当我将鼠标悬停在<td>上时,它会等待900毫秒然后发送大量请求(我总是在这900毫秒内将鼠标悬停在更多的tds上)。我究竟做错了什么?为什么只有clearTimeout(评论)有效?

我的观点是在点击服务器之前等待,如果用户在此正在运行的倒计时(900毫秒)内将鼠标移动到另一个<td>,则会中止之前的倒计时并且会发生新的倒计时

        $(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 个答案:

答案 0 :(得分:1)

您需要将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语句中的第一个条件毫无意义。我还删除了beforeSend函数中的var语句。