原生javascript实现简单的datagrid数据表格

yizhihongxing

请看下面的攻略:

一、什么是DataGrid数据表格

DataGrid数据表格是Web应用程序中常见的一种显示和编辑数据的方式。它通常由多个数据列和若干行组成,每一个单元格可以编辑文本、选项、日期等不同类型的数据。

二、实现DataGrid数据表格的基本思路

我们可以借助HTML的<table>标签来实现数据表格的显示和基本布局,然后用原生Javascript来实现数据的加载、筛选、排序和分页等功能。

1. 加载数据

我们可以通过Ajax从服务端获取数据,或者直接使用已有的静态数据,然后将数据填充到表格的每一行中。具体实现可以采用如下的步骤:

  • 创建一个<table>标签,定义好表格的样式和布局;
  • 创建一个空的<tbody>标签,用于后续动态添加行;
  • 使用Ajax或者其他方式获取数据;
  • 遍历数据数组,创建新的行和单元格,并填充数据;
  • 将新行添加到<tbody>标签中。

示例代码:

var data = [
  {name: '张三', age: 25, gender: '男', address: '北京'},
  {name: '李四', age: 30, gender: '男', address: '上海'},
  {name: '王五', age: 28, gender: '女', address: '广州'}
];

var tbody = document.querySelector('#myTable tbody');
for (var i = 0; i < data.length; i++) {
  var tr = document.createElement('tr');
  tr.innerHTML = '<td>' + data[i].name + '</td>' +
                 '<td>' + data[i].age + '</td>' +
                 '<td>' + data[i].gender + '</td>' +
                 '<td>' + data[i].address + '</td>';
  tbody.appendChild(tr);
}

2. 筛选数据

我们可以通过用户输入关键字或者选择某一列排序方式来实现数据的筛选。具体实现可以采用如下的步骤:

  • 创建一个输入框或者下拉菜单,用于用户输入筛选条件;
  • 监听输入框或者下拉菜单的inputchange事件,根据用户输入的条件动态过滤行;
  • 在过滤前需要保存原始数据,以便还原数据。

示例代码:

var originData = [
  {name: '张三', age: 25, gender: '男', address: '北京'},
  {name: '李四', age: 30, gender: '男', address: '上海'},
  {name: '王五', age: 28, gender: '女', address: '广州'}
];

var data = originData;

var input = document.querySelector('#filterInput');
input.addEventListener('input', function() {
  var keyword = input.value.trim().toLowerCase();
  data = originData.filter(function(item) {
    return item.name.toLowerCase().indexOf(keyword) >= 0 ||
           item.address.toLowerCase().indexOf(keyword) >= 0;
  });
  renderTable();
});

function renderTable() {
  var tbody = document.querySelector('#myTable tbody');
  tbody.innerHTML = '';
  for (var i = 0; i < data.length; i++) {
    var tr = document.createElement('tr');
    tr.innerHTML = '<td>' + data[i].name + '</td>' +
                   '<td>' + data[i].age + '</td>' +
                   '<td>' + data[i].gender + '</td>' +
                   '<td>' + data[i].address + '</td>';
    tbody.appendChild(tr);
  }
}

3. 排序数据

我们可以通过用户点击表格头部来实现数据的排序。具体实现可以采用如下的步骤:

  • 为每一列的表头添加一个点击事件监听器;
  • 监听器中根据当前列的数据值和排序方式(升序/降序)对表格行进行排序;
  • 排序前需要保存原始数据,以便还原数据。

示例代码:

var originData = [
  {name: '张三', age: 25, gender: '男', address: '北京'},
  {name: '李四', age: 30, gender: '男', address: '上海'},
  {name: '王五', age: 28, gender: '女', address: '广州'}
];

var data = originData;
var sortBy = 'name'; // 默认按照姓名排序
var sortOrder = 'asc'; // 默认升序排列

var ths = document.querySelectorAll('#myTable th');
for (var i = 0; i < ths.length; i++) {
  ths[i].addEventListener('click', function() {
    var key = this.dataset.key;
    if (sortBy === key) {
      sortOrder = sortOrder === 'asc' ? 'desc' : 'asc';
    } else {
      sortBy = key;
      sortOrder = 'asc';
    }
    sortTable();
    renderTable();
  });
}

function sortTable() {
  var compare;
  if (sortOrder === 'asc') {
    compare = function(a, b) {
      if (typeof a[sortBy] === 'number' && typeof b[sortBy] === 'number') {
        return a[sortBy] - b[sortBy];
      } else {
        return a[sortBy].toString().localeCompare(b[sortBy].toString());
      }
    };
  } else {
    compare = function(a, b) {
      if (typeof a[sortBy] === 'number' && typeof b[sortBy] === 'number') {
        return b[sortBy] - a[sortBy];
      } else {
        return b[sortBy].toString().localeCompare(a[sortBy].toString());
      }
    };
  }
  data = data.sort(compare);
}

function renderTable() {
  var tbody = document.querySelector('#myTable tbody');
  tbody.innerHTML = '';
  for (var i = 0; i < data.length; i++) {
    var tr = document.createElement('tr');
    tr.innerHTML = '<td>' + data[i].name + '</td>' +
                   '<td>' + data[i].age + '</td>' +
                   '<td>' + data[i].gender + '</td>' +
                   '<td>' + data[i].address + '</td>';
    tbody.appendChild(tr);
  }
}

4. 分页数据

如果数据量很大,我们可以通过分页来提高数据的显示效率和用户体验。具体实现可以采用如下的步骤:

  • 设置每页显示的数据条数和当前页码;
  • 根据当前页码和每页显示的数据条数计算出需要显示的数据范围;
  • 显示当前页的数据并更新页码和页码按钮状态。

示例代码:

var originData = [
  {name: '张三', age: 25, gender: '男', address: '北京'},
  {name: '李四', age: 30, gender: '男', address: '上海'},
  {name: '王五', age: 28, gender: '女', address: '广州'},
  {name: '赵六', age: 33, gender: '男', address: '深圳'},
  {name: '钱七', age: 27, gender: '女', address: '西安'},
  {name: '孙九', age: 31, gender: '男', address: '武汉'},
  // ... 省略部分数据
  {name: '吴十', age: 26, gender: '女', address: '天津'}
];

var data = originData;
var perPage = 5; // 每页显示5条数据
var currentPage = 1; // 当前第1页

var inputPage = document.querySelector('#inputPage');
var btnPrev = document.querySelector('#btnPrev');
var btnNext = document.querySelector('#btnNext');

inputPage.addEventListener('input', function() {
  var num = parseInt(inputPage.value);
  if (num >= 1 && num <= getTotalPage()) {
    currentPage = num;
    renderTable();
  }
});

btnPrev.addEventListener('click', function() {
  if (currentPage > 1) {
    currentPage--;
    renderTable();
  }
});

btnNext.addEventListener('click', function() {
  if (currentPage < getTotalPage()) {
    currentPage++;
    renderTable();
  }
});

function getTotalPage() {
  return Math.ceil(data.length / perPage);
}

function getPageData() {
  var start = (currentPage - 1) * perPage;
  var end = Math.min(start + perPage, data.length);
  return data.slice(start, end);
}

function renderTable() {
  var tbody = document.querySelector('#myTable tbody');
  tbody.innerHTML = '';
  var pageData = getPageData();
  for (var i = 0; i < pageData.length; i++) {
    var tr = document.createElement('tr');
    tr.innerHTML = '<td>' + pageData[i].name + '</td>' +
                   '<td>' + pageData[i].age + '</td>' +
                   '<td>' + pageData[i].gender + '</td>' +
                   '<td>' + pageData[i].address + '</td>';
    tbody.appendChild(tr);
  }
  inputPage.value = currentPage;
  btnPrev.disabled = currentPage === 1;
  btnNext.disabled = currentPage === getTotalPage();
}

三、实现一个简单的DataGrid数据表格

综合以上思路,我们可以实现一个简单的DataGrid数据表格。具体代码见下:

```html





DataGrid数据表格示例



姓名 年龄 性别 地址


/

  • CSS重要属性之 margin 属性知识大整合(必看篇)

    CSS 重要属性之 margin 属性知识大整合(必看篇) 什么是 margin? 在 CSS 中,margin 指的是页面元素的外边距,即一个元素与其周围元素之间的距离。 margin 的语法 margin 属性的语法如下: margin: top right bottom left; 其中,四个值分别表示上、右、下、左方向的外边距大小,也可以使用以下缩写…

    css 2023年6月9日
    00
  • CSS3波浪效果示例(前端必学)

    下面我为大家详细讲解“CSS3波浪效果示例(前端必学)”的完整攻略。 1. 环境准备 首先,我们要准备好编辑器工具,例如Sublime、VSCode等,并且要在电脑上安装好Chrome浏览器。 2. HTML结构 首先,我们先来看一下HTML结构。我们需要一个包含一个<section>标签的HTML文件,代码如下: <!DOCTYPE ht…

    css 2023年6月9日
    00
  • 使用CSS3的背景渐变Text Gradient 创建文字颜色渐变

    使用 CSS3 的背景渐变 Text Gradient 可以创建文字颜色渐变效果,让文字看起来更加美观。本文将向您展示如何使用 CSS3 的 Text Gradient 创建文字颜色渐变。 步骤 1. 创建 HTML 结构 首先,在您的 HTML 文件中创建一个元素,用于标识您将要应用 Text Gradient 的文本,例如: <div class=…

    css 2023年6月9日
    00
  • 利用Three.js实现3D三棱锥立体特效

    实现3D三棱锥立体特效的完整攻略,可以分为以下三个步骤: 1. 准备工作 首先,需要在HTML文件中引入Three.js库文件,可以从官网上下载并引入到HTML文件中。 其次,需要在HTML文件的body中添加一个容器元素用来显示3D场景,例如: <body> <div id="container"></di…

    css 2023年6月10日
    00
  • JS Tween 颜色渐变

    JS Tween 是一个基于 JavaScript 的动画库,可以帮助我们快速实现各种动画效果。其中,颜色渐变是很常见的一种动画效果,本篇攻略就来详细讲解如何使用 JS Tween 实现颜色渐变。 准备工作 在正式开始之前,我们需要先引入 JS Tween 库。可以在官方网站上下载相应的代码包,也可以使用 npm 命令进行安装: npm install tw…

    css 2023年6月11日
    00
  • css hover对其包含的子元素进行样式设置示例

    当我们在网页设计中使用CSS样式时,使用:hover伪类来为鼠标移动到元素上时设置一些特殊的样式是很有用的。这个功能可以很方便地对网站的交互性和美观性进行调整和完善。接下来,我会详细讲解如何使用CSS设置:hover的样式,以及如何对其包含的子元素进行样式设置。下面是示例: 改变父元素及其子元素样式 首先,我们准备一个HTML文档: <div clas…

    css 2023年6月10日
    00
  • 合作推广
    合作推广
    分享本页
    返回顶部