开发者

Prevent stacking of AJAX-requests

I've got a problem which I can't seem to solve.

I'm currently implementing a an AJAX-function similar to the one Twitter uses - that fetch new posts on scrolling.

The jQuery looks something like this:

        $(window).scroll(function(){
            if($(window).scrollTop() == $(document).height() - $(window).height()){
                $('div#ajaxloader').show();
                $.ajax({
                    url: "loader.php?lastid=" + $(".container:last").attr("id"),
                    success: function(html){
                        if(html){
                            $("#main").append(html);
                            $('div#ajaxloader').hide();
                        }else{
                            $('div#ajaxloader').html('No more posts to show.');
                        }
                    }        开发者_JAVA技巧           
                });
            }
        });

Now the problem; if the user scrolls really fast and the database is doing it's work quickly - the jQuery doesn't seem to be able to send the correct id as a query fast enough - which results in double-posts.

Anyone have a good idea on how to prevent this?


Try This:

  var runningRequest = 0;
  $(window).scroll(function(){
        if(runningRequest <1){
        if($(window).scrollTop() == $(document).height() - $(window).height()){
            runningRequest++;
            $('div#ajaxloader').show();
            $.ajax({
                url: "loader.php?lastid=" + $(".container:last").attr("id"),
                success: function(html){
                    runningRequest--;
                    if(html){
                        $("#main").append(html);
                        $('div#ajaxloader').hide();
                    }else{
                        $('div#ajaxloader').html('No more posts to show.');
                    }
                }
                error: function(){runningRequest--;}                   
            });
        }
        }
    });


I would set a boolean to true right before making my request, and whenever the request completes I'd set it back to false. Then I'd wrap the code that makes the request in a check for whether that value is true or false. I'd also add a bool that tells me whether I should even bother making a request--no sense in requesting if the last request came back empty (unless, perhaps, the data set could change since the last request). Either way, here's the code I'd start with:

( function( global )
{
    var $ = global.jQuery,
        $win = $( global ),
        $doc = $( global.document ),
        $ajaxLoader = $( 'div#ajaxloader' ),
        $main = $( '#main' ),
        requestInProgress = false,
        outOfPosts = false;

    $win.scroll( function()
    {
        if( ! requestInProgress &&
            ! outOfPosts &&
            $win.scrollTop() === $doc.height() - $win.height()
          )
        {
            requestInProgress = true;

            $ajaxLoader.show();

            $.ajax( {
                url: 'loader.php',
                data: {
                    lastid: $( '.container:last' ).attr( 'id' )
                },
                success: function( html )
                {
                    if( html )
                    {
                        $main.append( html );
                        $ajaxLoader.hide();
                    }
                    else
                    {
                        outOfPosts = true;
                        $ajaxLoader.html( 'No more posts to show.' );
                    }
                },
                complete: function()
                {
                    requestInProgress = false;
                }
            } );
        }
    } );
}( window ) );
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜