【问题标题】:How can i apply pagination to display 3 items per page如何应用分页以每页显示 3 个项目
【发布时间】:2020-01-30 23:18:50
【问题描述】:

我有一个获取的项目列表如下:

<ul id="products" class="abcd" style="display: block;">
    <li class="productslist">item1</li>
    <li class="productslist">item2</li>
    <li class="productslist">item3</li>
    <li class="productslist">item4</li>
    <li class="productslist">item5</li>
    <li class="productslist">item6</li>
    <li class="productslist">item7</li>
    <li class="productslist">item8</li>
    <li class="productslist">item9</li>
    <li class="productslist">item10</li>
    <li class="productslist">item11</li>
    <li class="productslist">item12</li>
    <li class="productslist">item13</li>
</ul>

现在我需要在应用分页后每页显示 3 个项目。请帮助我使用 Javascript。

【问题讨论】:

    标签: javascript html pagination


    【解决方案1】:

    这个问题相当广泛,但是考虑到这个解决方案对于较长的列表来说不是一个很好的解决方案,下面的代码将帮助您了解该怎么做。

    const list = [...document.querySelectorAll('.productslist')];
    let count = 0;
    const items_per_page = 3;
    const pagination_numbers_container = document.querySelector('.pagination-numbers');
    
    const paginate = (p) => {
      
      hideAll();
       
      if(p === 'next') count += items_per_page;
      else if(p === 'previous') count -= items_per_page;
      else count = p;
     
      if(count < 0 ) count = 0;
      else if(count >= (list.length - items_per_page)) count = (list.length - items_per_page) + ((list.length+1) % items_per_page);
      
      for(let i = count; i < (count+items_per_page); i++) {
        if(list[i]) list[i].style.display = 'block';
      }
      
    }
    
    
    const paginateNumberClickHandler = (evt) => {
    	const page = parseInt(evt.currentTarget.getAttribute('data-page'));
      paginate(page * items_per_page)
    }
    
    const createPaginationNumbers = () => {
      
      const total_pages_rest = list.length % items_per_page;
      const total_pages = (list.length / items_per_page);
      const pagination_numbers = [];
      pagination_numbers_container.innerHTML = '';
      for(let i = 0; i < total_pages; i++) {
        pagination_numbers_container.innerHTML += `<button data-page="${i}" class="pag">${i+1}</button>`;
      }
        
      [...document.querySelectorAll('.pag')].forEach( (p) => p.addEventListener('click', paginateNumberClickHandler ));
    }
    
    const hideAll = () => list.forEach( (l) => l.style.display = 'none');
    
    const next = document.querySelector('.next');
    const previous = document.querySelector('.previous');
    next.addEventListener('click', (e) => paginate("next"));
    previous.addEventListener('click', (e) => paginate("previous"));
    
    
    paginate(0);
    createPaginationNumbers();
    <ul id="products" class="abcd" style="display: block;">
    <li class="productslist">item1</li>
    <li class="productslist">item2</li>
    <li class="productslist">item3</li>
    <li class="productslist">item4</li>
    <li class="productslist">item5</li>
    <li class="productslist">item6</li>
    <li class="productslist">item7</li>
    <li class="productslist">item8</li>
    <li class="productslist">item9</li>
    <li class="productslist">item10</li>
    <li class="productslist">item11</li>
    <li class="productslist">item12</li>
    <li class="productslist">item13</li>
    </ul>
    <div class="pagination-numbers">
      
    </div>
    <button class="previous">
    Previous
    </button>
    <button class="next">
    Next
    </button>

    【讨论】:

    • 非常感谢@gugateider 的回答。它真的对我理解逻辑有很大帮助。现在我可以在我的代码中申请了。
    • 我面临的唯一问题是,当继续单击下一个按钮时,一旦到达最后一组,它就会显示第一组。你能帮忙吗?
    • 不客气,希望你明白分页的逻辑。基本上你只需要编辑else if 条件。我已经更新了答案,看看
    • 我正在尝试在“上一个”和“下一个”按钮之间实现页码编号,但无法重复 1 2 3 之类的编号,只是想知道上面的示例是否可行?
    • 是的,这是可能的,您只需要确保此列表不会太大,如果是这样,我建议您动态加载此数据。我已根据您的需要更新了答案。
    猜你喜欢
    • 2019-09-06
    • 2020-08-19
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    相关资源
    最近更新 更多