首页 > 编程问答 >如何对嵌套 div 表格进行排序?

如何对嵌套 div 表格进行排序?

时间:2024-06-12 22:24:19浏览次数:15  
标签:javascript html

我正在寻找一种解决方案,以便能够根据一个 "列 "中的值对 div 表格进行排序。在下面的示例中,排序列的 div 类为 "text-fl"。

交互式排序,在这种排序中,数据最初是按照代码中的方式加载的,但如果用户选择按值排序,他们可以点击列标题。

由于我的数据不在列表中,因此我认为我无法使用我找到的基于 ul li 架构的现有示例。

为什么表格使用 div 和 .less 构建?这是为了使它们具有超强的响应能力,并能在较小的屏幕上进行转换。不过,这其中的利弊需要单独讨论。

数据结构如下:

<div class="container" id="sort-table">;
    <div class="tb-row header">;
        <div class="wrapper series-year">;
            <div class="text-series">Series</div>;
            <div class="text-year">Year</div>;
        </div>;
        <div class="wrapper rd-layout-driver">;
            <div class="text-round">Round</div>;
            <div class="text-layout">Layout</div>;
            <div class="text-driver">Driver</div>;
        </div>;
        <div class="wrapper car-fl">;
            <div class="text-car">Car</div>;
            <div class="text-fl">Fastest lap</div>;
        </div>;
    </div>;
    <div class='tb-row'>;
        <div class='wrapper series-year'>;
            <div class='text-series' title='BTCC'>BTCC</div>;
            <div class='text-year'>2024</div>;
        </div>;
        <div class='wrapper rd-layout-driver'>;
            div class='text-round'>12</div>;
            <div class='text-layout'>Full</div>;
            <div class='text-driver'>Ashley Sutton</div>;
        </div>;
        <div class='wrapper car-fl'>;
            <div class='text-car' title='福特福克斯'>福特福克斯</div>;
            <div class='text-fl' title='FL'>1:15.753</div>;
        </div>;
    </div>;
    <div class='tb-row'>;
        <div class='wrapper series-year'>;
            <div class='text-series' title='BTCC'>BTCC</div>;
            <div class='text-year'>2024</div>;
        </div>;
        <div class='wrapper rd-layout-driver'>;
            <div class='text-round'>11</div>;
            <div class='text-layout'>Full</div>;
            <div class='text-driver'>Dan Cammish</div>;
        </div>;
        <div class='wrapper car-fl'>;
            <div class='text-car' title='福特福克斯'>福特福克斯</div>;
            <div class='text-fl' title='FL'>1:16.467</div>;
        </div>;
    </div>;
    <div class='tb-row'>;
        <div class='wrapper series-year'>;
            <div class='text-series' title='BTCC'>BTCC</div>;
            <div class='text-year'>2024</div>;
        </div>;
        <div class='wrapper rd-layout-driver'>;
            div class='text-round'>10</div>;
            <div class='text-layout'>Full</div>;
            <div class='text-driver'>Jake Hill</div>;
        </div>;
        <div class='wrapper car-fl'>;
            <div class='text-car' title='宝马 330'>BMW 330</div>;
            <div class='text-fl' title='FL'>1:16.246</div>;
        </div>;
    </div>;
</div>;

是否有简单的解决方案?


当然,我可以帮实现这个目标。以下是如何根据“最快圈速”列对 div 表格进行排序的解决方案:

document.addEventListener('DOMContentLoaded', () => {
  const sortTable = document.getElementById('sort-table');
  const headerRow = sortTable.querySelector('.header');
  let sortColumn = null;
  let sortAscending = true;

  headerRow.addEventListener('click', (event) => {
    const clickedColumn = event.target.closest('.wrapper');

    if (clickedColumn) {
      const columnIndex = Array.from(headerRow.children).indexOf(clickedColumn);
      if (sortColumn === columnIndex) {
        sortAscending = !sortAscending;
      } else {
        sortColumn = columnIndex;
        sortAscending = true;
      }

      sortRows();
    }
  });

  function sortRows() {
    const rows = Array.from(sortTable.querySelectorAll('.tb-row:not(.header)'));
    rows.sort((a, b) => {
      const aValue = a.children[sortColumn].querySelector('.text-fl').textContent.trim();
      const bValue = b.children[sortColumn].querySelector('.text-fl').textContent.trim();

      if (sortColumn === 3) { // Fastest lap column
        const aTime = parseFloat(aValue.replace(':', ''));
        const bTime = parseFloat(bValue.replace(':', ''));
        return sortAscending ? aTime - bTime : bTime - aTime;
      } else {
        return sortAscending
          ? aValue.localeCompare(bValue)
          : bValue.localeCompare(aValue);
      }
    });

    rows.forEach(row => sortTable.appendChild(row));
  }
});

代码解释:

  1. 事件监听器: 代码首先为表头行 ( header 类) 添加了一个点击事件监听器。
  2. 获取点击的列: 当用户点击表头中的某个元素时,代码会找到其父级 .wrapper 元素,该元素代表被点击的列。
  3. 确定排序顺序: 代码会跟踪当前排序的列 ( sortColumn ) 和排序顺序 ( sortAscending )。如果点击了同一列,则排序顺序反转。
  4. sortRows 函数: 该函数负责对表格行进行排序。
  5. 它获取所有数据行 ( .tb-row:not(.header) ) 并将其转换为数组。
  6. 使用 sort 方法对数组进行排序。比较函数根据 sortColumn sortAscending 的值来比较两行的值。
  7. 对于“最快圈速”列,代码将时间转换为数字以便进行比较。
  8. 排序后,代码使用 appendChild 方法将排序后的行重新添加到表格中。

如何使用:

  1. 将此 JavaScript 代码添加到的 HTML 页面中。最好将其放在 <script> 标签中,位于 </body> 结束标签之前。

现在,的 div 表格应该可以根据“最快圈速”列进行交互式排序。点击其他列标题也会对相应的列进行排序。

标签:javascript,html
From: 78613288

相关文章

  • 39.HTML基础
    【一】HTML基础1)概念HTML:超文本标记语言如果想让浏览器能够渲染出写的页面,都必须遵从HTML语法我们浏览器看到的页面,内部其实都是HTML代码2)基础页面格式<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head......
  • 二级web基础操作题练习(6)——嵌入Javascript代码
    -----要求----- 用JavaScript编写如图1所示页面,当在第一个文本框中输入URLhttp://test.cn/index.jsp?key0=0&key1=1&key2=2,点击按钮“解析参数“后,在下面的三个文本框中分别显示解析出来的参数,如图2所示。图1图2 -----代码示例-----<html><head><!--设置字符编......
  • Laravel 解决blade模板转义html标签问题
    当我们使用富文本编译器(如:Ueditor编译器)保存编辑的内容后,在blade模板中,想要显示原生的html标签内容时该怎么做?首先,了解下laravel{{变量名}}与{!!变量名!!}区别{{变量名}}:转义输出,只是被当成普通的字符串输出{!!变量名!!}:原生输出html,比如图片,链接,JS代码等实例:编译器......
  • HTML基础1.1
    HTML基础1结构html数据库\Windowsserver网络设备(华为/H3C)linux云计算html站点站点新建站点站点名称shengbang本地站点文件夹d:\shengbang(需要新建)高级设置默认图像文件夹d:\shengbang\images(需要新建)HTML文档的结构<html></html><head>......
  • html2canvas前端生成PDF开箱即用
    目录1.下载html2canvas、jspdf2.创建工具类exportPdf文件3.页面中使用需求:将页面展示的所有信息都导出一个pdf文件 实现前端生成PDF只要3步 1.下载html2canvas、[email protected]@2.5.12.创建工具类exportPdfjs文件复制即用//导出页......
  • JavaScript常用的流程控制语句
    在JavaScript中,有以下几种常用的流程控制语句:if...else:当if条件为假时,可以使用else语句执行另一段代码。if(condition){//条件为真时执行的代码}else{//条件为假时执行的代码}if...elseif...else:可以链式使用多个if和elseif来根据多个条件执行不......
  • HTML+CSS+JS 倒计时动画效果
    1.整体效果https://mmbiz.qpic.cn/mmbiz_gif/iaVb9cSjKNDeLc7vbAUXJ4yFicKsd2d94ibVgYMJYz3frKeib1tibZhf78kc70gVp9EoqQw16Xzia6OialDaibic9o4iaMfg/640?wx_fmt=gif&from=appmsg&wxfrom=13&tp=wxpic实现了一个倒计时动画效果,包括数字区域和倒计时结束区域。数字区域显......
  • 下载使用nginx发布html自定义页面
    在浏览器搜索nginx.org,然后点击download,接着点击 stableandmainline选择自己所使用系统对应的信息后点击(我用的是CentOS,所以需要点击RHELandderivatives)vim/etc/yum.repos.d/nginx.repo[nginx-stable]name=nginxstablerepobaseurl=http://nginx.org/packages/ce......
  • JavaScript判断数据为对象(转载)
    1.javaScript判断数据为对象1.1. Object.prototype.toString.call()2.JavaScript如何判断数据类型2.1. typeof2.2. Array.isArray()2.3. instanceof2.4. Object.prototype.toString.call()2.5. constructor2.6. 使用ES6的Symbol.toStringTa......
  • 基本数据类型 String,null 和 undefined,运算符,流程控制,JavaScript之数组,数组常用
    Ⅰ基本数据类型String【一】String类型String类型就是字符串类型【二】定义变量【1】常规变量var变量名="变量值";//一般用这种var变量名='变量值';不支持三引号【2】可以先声明不赋值先用varb;再对变量b赋值varb='6';【三】字符串的格式化输出语法......