Home > Enterprise >  Why does the CSS loader keep appearing after all the items are loaded?
Why does the CSS loader keep appearing after all the items are loaded?

Time:10-14

I have been working on an online newspaper/blogging application with CodeIgniter 3.1.8 and Twitter Bootstrap 4.

I am currently working on loading more posts via AJAX.

By default, the posts are paginated and displayed 12 at a time, at http://myblog.com/, http://myblog.com/?page=2, and so on.

In the Posts controller (application\controllers\Posts.php) I have

private function _initPagination($path, $totalRows, $query_string_segment = 'page')
{
    //load and configure pagination 
    $this->load->library('pagination');
    $config['base_url']             = base_url($path);
    $config['query_string_segment'] = $query_string_segment;
    $config['enable_query_strings'] = TRUE;
    $config['reuse_query_string']   = TRUE;
    $config['total_rows']           = $totalRows;
    $config['per_page']             = 12;

    if($this->Static_model->get_static_data()['has_pager']){
        $config['display_pages'] = FALSE;
        $config['first_link'] = FALSE;
        $config['last_link'] = FALSE;
        $config['prev_tag_open'] = '<li class="prev">';
        $config['prev_tag_close'] = '</li>';
        $config['next_tag_open'] = '<li class="next">';
        $config['next_tag_close'] = '</li>';
    }

    if (!isset($_GET[$config['query_string_segment']]) || $_GET[$config['query_string_segment']] < 1) {
        $_GET[$config['query_string_segment']] = 1;
    }
    $this->pagination->initialize($config);
    
    $limit  = $config['per_page'];
    $offset = ($this->input->get($config['query_string_segment']) - 1) * $limit;
    
    return array(
        'limit' => $limit,
        'offset' => $offset
    );
}

public function index()
{
    //call initialization method
    $config = $this->_initPagination("/", $this->Posts_model->get_num_rows());
    $data                  = $this->Static_model->get_static_data();
    $data['base_url']      = base_url("/");
    $data['pages']         = $this->Pages_model->get_pages();
    $data['categories']    = $this->Categories_model->get_categories();
    $data['search_errors'] = validation_errors();
    
    //use limit and offset returned by _initPaginator method
    $data['posts'] = $this->Posts_model->get_posts($config['limit'], $config['offset']);
    $this->twig->addGlobal('pagination', $this->pagination->create_links());
    
    // featured posts
    if ($data['is_featured']) {
        $data['featured'] = $this->Posts_model->featured_posts();
        $this->twig->addGlobal('featuredPosts', "themes/{$data['theme_directory']}/partials/hero.twig");
    }
    
    $this->twig->display("themes/{$data['theme_directory']}/layout", $data);
} 

In order to load the posts via jQuery Ajax instead, I have:

(function($) {

    var currentPage = 1;

    $('.pagination').hide();

    $(window).scroll(function() {
        if ($(window).scrollTop() >= $(document).height() - $(window).height() - 10) {
            loadMore();
        }
    });

    function loadMore() {
        $.ajax({
                url: baseUrl   '?page='   currentPage,
                type: 'GET',
                beforeSend: function() {
                    $('.loader').show();
                }
            })
            .done(function(data) {
                $('.loader').hide();
                // Get post from page 2 onward
                if (currentPage >= 2) {
                    var posts = $(data).find('#postsContainer').html();
                }
                // If there are no more posts, hide loader
                //  Otherwise, load more posts
                if (posts == 'undefined') {
                    $('.loader').hide();
                } else {
                    $('#postsContainer').append(posts);
                    currentPage = currentPage   1;
                }
            });
    }

})(jQuery);

The problem:

After loading the last post, if I scroll back up (or up and down), the loader is displayed and hidden repeatedly.


What am I doing wrong? How can I fix this bug?

CodePudding user response:

I solved the problem by initializing the variable posts with null and making sure that posts is not undefined before showing the loader:

(function($) {

    var currentPage = 1;
    var posts = null;

    $('.pagination').hide();

    $(window).scroll(function() {
        if ($(window).scrollTop() >= $(document).height() - $(window).height() - 25) {
            loadMore();
        }
    });

    function loadMore() {
        $.ajax({
                url: baseUrl   '?page='   currentPage,
                type: 'GET',
                beforeSend: function() {
                    if (typeof posts != 'undefined') {
                        $('.loader').show();
                    }
                }
            })
            .done(function(data) {
                $('.loader').hide();
                // Get post from page 2 onward
                if (currentPage >= 2) {
                    posts = $(data).find('#postsContainer').html();
                }
                // If there are no more posts, hide loader
                //  Otherwise, load more posts
                if (typeof posts == 'undefined') {
                    $('.loader').hide();
                } else {
                    $('#postsContainer').append(posts);
                    currentPage = currentPage   1;
                }
            });
    }

})(jQuery);
  • Related