You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JavaScript切割数组结合Bootstrap及Ajax实现卡片渲染?

实现JavaScript切割数组生成Bootstrap卡片的方案

嘿,看起来你已经搞定了数据获取和卡片HTML字符串的生成,接下来切割数组分批渲染卡片其实很简单,结合Bootstrap的栅格系统,咱们可以这么做:

核心思路

因为你用的是col-sm-3,一行刚好能放4张卡片,所以咱们可以把htmlCards数组按每4个元素一组切割,然后逐组渲染到页面的容器里;如果需要分页,也可以基于这个逻辑来实现。

具体实现步骤

1. 准备页面容器

首先在HTML里准备一个用来放卡片的Bootstrap行容器:

<div class="container">
  <div id="cards-container" class="row"></div>
  <!-- 如果需要分页控件,再加个分页栏 -->
  <nav aria-label="Page navigation">
    <ul id="pagination" class="pagination justify-content-center"></ul>
  </nav>
</div>

2. 切割数组并渲染的函数

写一个通用函数,接收要渲染的数组片段,把它插入到容器里:

// 渲染卡片片段到容器
function renderCards(cardFragment) {
  const container = document.getElementById('cards-container');
  // 清空容器(如果需要重新渲染的话)
  container.innerHTML = '';
  // 把数组里的HTML字符串拼接起来插入
  container.innerHTML = cardFragment.join('');
}

// 切割数组的函数(按每页count个元素)
function splitAndRenderCards(cardsArray, itemsPerPage = 4, currentPage = 1) {
  // 计算起始和结束索引
  const startIndex = (currentPage - 1) * itemsPerPage;
  const endIndex = startIndex + itemsPerPage;
  // 切割数组
  const currentCards = cardsArray.slice(startIndex, endIndex);
  // 渲染当前页的卡片
  renderCards(currentCards);
  // 生成分页控件(可选)
  generatePagination(cardsArray.length, itemsPerPage, currentPage);
}

3. 分页控件生成(可选)

如果需要分页功能,再加个生成分页按钮的函数:

function generatePagination(totalItems, itemsPerPage, currentPage) {
  const pagination = document.getElementById('pagination');
  pagination.innerHTML = '';
  const totalPages = Math.ceil(totalItems / itemsPerPage);

  // 上一页按钮
  const prevLi = document.createElement('li');
  prevLi.className = `page-item ${currentPage === 1 ? 'disabled' : ''}`;
  prevLi.innerHTML = `<a class="page-link" href="#" data-page="${currentPage - 1}">Previous</a>`;
  pagination.appendChild(prevLi);

  // 页码按钮
  for (let i = 1; i <= totalPages; i++) {
    const pageLi = document.createElement('li');
    pageLi.className = `page-item ${i === currentPage ? 'active' : ''}`;
    pageLi.innerHTML = `<a class="page-link" href="#" data-page="${i}">${i}</a>`;
    pagination.appendChild(pageLi);
  }

  // 下一页按钮
  const nextLi = document.createElement('li');
  nextLi.className = `page-item ${currentPage === totalPages ? 'disabled' : ''}`;
  nextLi.innerHTML = `<a class="page-link" href="#" data-page="${currentPage + 1}">Next</a>`;
  pagination.appendChild(nextLi);

  // 给分页按钮绑定点击事件
  pagination.querySelectorAll('.page-link').forEach(link => {
    link.addEventListener('click', function(e) {
      e.preventDefault();
      const page = parseInt(this.dataset.page);
      if (page >= 1 && page <= totalPages) {
        splitAndRenderCards(htmlCards, 4, page);
      }
    });
  });
}

4. 在Ajax成功回调里调用

把这个逻辑放到你的Ajax成功回调里,数据获取完成后直接调用:

htmlCards = []; 
$.ajax({ 
  async: true, 
  url: 'xxx.com', 
  type: 'GET', 
  contentType: 'application/json; charset=utf-8', 
  dataType: 'json', 
  success: function(data) { 
    for(var i=0; i<data.length; i++) { 
      // 这里注意,不要用eval,直接用模板字符串拼接更安全!
      htmlCards.push(`<div class='col-sm-3 mb-4'>
        <img class='movie-selection img-fluid' src="${data[i].posterUrl}" alt="${data[i].title}">
        <h5 class="mt-2">${data[i].title}</h5>
      </div>`);
    }
    // 渲染第一页的卡片
    splitAndRenderCards(htmlCards);
  },
  error: function() {
    alert('数据加载失败,请稍后重试');
  }
});

关键细节提醒

  • 👉 不要用eval!直接用模板字符串(反引号`)拼接HTML更安全也更易读,能避免XSS风险和语法错误。
  • 👉 给每个卡片加mb-4类,让卡片之间有底部间距,排版更美观。
  • 👉 图片加img-fluid类,确保在响应式布局里自适应大小。
  • 👉 如果不需要分页,直接调用renderCards(htmlCards)就能一次性渲染所有卡片。

内容的提问来源于stack exchange,提问作者MAMA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:54:47