今天来教大家如何使用 ale.js 制作一个小而美的表格编辑器,首先先上 gif:

是不是还是有一点非常 cool 的感觉的?那么我们现在开始吧!

这是我们这篇文章结束后完成的效果(如果想继续完成请访问第四篇文章):

ok,那继续开始吧(本篇文章是表格编辑器系列的第三篇文章,如果您还没有看过第一篇,请访问 第一篇文章(开源中国)):

首先让我们把每一个列表项都添加一个他们的行数和列数作为 dataset 数据吧!

先创建一个 rowId 变量:

//在 handleTemplateRender 函数里,我们把:
var returnVal = "<table><thead><tr>",getSortSign = this.methods.getSortSign,sortBy = this.staticData.sortBy;//改为
var returnVal = "<table><thead><tr>",getSortSign = this.methods.getSortSign,sortBy = this.staticData.sortBy,rowId = -1;

然后再在 “循环遍历bookData数据并输出” 这行注释所对应的forEach函数的里面创建一个名叫 cellId 的变量:(就是输出td标签的forEach)

//原来的代码
this.data.bookData.forEach(function(thisBook, i, arr) {//输出一行returnVal += "<tr>";thisBook.forEach(function(val, i, arr) {//输出一列returnVal += "<td>" + val + "</td>";})returnVal += "</tr>";
})//改为
this.data.bookData.forEach(function(thisBook, i, arr) {var cellId = -1; //这里增加了一行代码//输出一行returnVal += "<tr>";thisBook.forEach(function(val, i, arr) {//输出一列returnVal += "<td>" + val + "</td>";})returnVal += "</tr>";
})

当然这样还没完,我们还需要改为这样:

this.data.bookData.forEach(function(thisBook, i, arr) {var cellId = -1;//这里让rowId++rowId++;returnVal += "<tr>";thisBook.forEach(function(val, i, arr) {//这里让cellId++cellId++;//注意这里写了 datasetreturnVal += "<td data-row='" + rowId + "' data-cell='" + cellId + "'>" + val + "</td>";})returnVal += "</tr>";
})

这样你就可以看到在控制台上已经输出了它们的 dataset:

接下来,让我们往 data 里面添加一个名叫 edit 的对象,用来指定我们点击的到底是哪个表格:

edit: {row: -1, //默认为-1,因为没有选中表格cell: -1
}

然后,我们把下面这行代码,给他添加一个 ondblclick:

returnVal += "<td data-row='" + rowId + "' data-cell='" + cellId + "'>" + val + "</td>";//改为newVal += "<td data-cell='" + cellId + "' data-row='" + rowId + "' ondblclick='this.methods.handleBlockOndblclick(event)'>" + val + "</td>";

然后我们在 methods 对象里面添加一个 handleBlockOndblclick 的函数:

handleBlockOndblclick(e) {if (!this.staticData.isOpenEdit) { //判断是否开启了editthis.staticData.isOpenEdit = true;//获取并设置目标格位置this.data.edit = {row: parseInt(e.target.dataset.row),cell: parseInt(e.target.dataset.cell)}}
}

因为在 handleBlockOndblclick 函数里面,我们用到了静态数据的 isOpenEdit,所以我们需要定义一个:

isOpenEdit: false

ok,那么之后我们需要再改进一下输出 book 数据的那一行代码,把他改成这样:

thisBook.forEach(function(val, i, arr) {cellId++;if (rowId === edit.row && cellId === edit.cell) {returnVal += "<td><form data-cell='" + cellId + "' data-row='" + rowId + "' onsubmit='this.methods.save(event)'><input type='text' value='" + val + "'></form></td>";} else {returnVal += "<td data-cell='" + cellId + "' data-row='" + rowId + "' ondblclick='this.methods.handleBlockOndblclick(event)'>" + val + "</td>";}
})

接下来让我们在上方定义一个名叫 edit 的变量吧:

//把
var returnVal = "<table><thead><tr>",getSortSign = this.methods.getSortSign,sortBy = this.staticData.sortBy,rowId = -1;//改为
var returnVal = "<table><thead><tr>",getSortSign = this.methods.getSortSign,sortBy = this.staticData.sortBy,rowId = -1,edit = this.data.edit;

之后我们还需要在 methods 里添加一个 save 函数,用来保存修改后的结果:

save(e) {e.preventDefault();var input = e.target.firstChild;this.staticData.isOpenEdit = false;this.data.edit = {row: -1,cell: -1}this.data.bookData[e.target.dataset.row][e.target.dataset.cell] = input.value;this.data.bookData = this.data.bookData;
}

好了,那么现在我们的编辑器就可以正式运作了,我们已经实现了本篇文章最开始时所做的功能!(按回车可以保存修改结果)

这是我们目前全部的 js 代码:

Ale("excel", {template() {return this.methods.handleTemplateRender();},methods: {handleTemplateRender() {//定义DOM基本结构var returnVal = "<table><thead><tr>",getSortSign = this.methods.getSortSign,sortBy = this.staticData.sortBy,rowId = -1,edit = this.data.edit;//循环遍历bookHeader数据并输出this.data.bookHeader.forEach(function(val, i, arr) {returnVal += "<th onclick='this.methods.handleTheadOnclick(event)'>" + val + (sortBy === i ? getSortSign() : '') + "</th>";})returnVal += "</thead></tr><tbody>";//循环遍历bookData数据并输出this.data.bookData.forEach(function(thisBook, i, arr) {var cellId = -1;rowId++;//输出一行returnVal += "<tr>";thisBook.forEach(function(val, i, arr) {cellId++;if (rowId === edit.row && cellId === edit.cell) {returnVal += "<td><form data-cell='" + cellId + "' data-row='" + rowId + "' onsubmit='this.methods.save(event)'><input type='text' value='" + val + "'></form></td>";} else {returnVal += "<td data-cell='" + cellId + "' data-row='" + rowId + "' ondblclick='this.methods.handleBlockOndblclick(event)'>" + val + "</td>";}})returnVal += "</tr>";})returnVal += "</tbody></table>";//返回DOM结构return returnVal;},handleTheadOnclick(e) {this.methods.changeSortType(e);this.methods.sortList(e);},changeSortType(e) {this.staticData.sortBy = e.target.cellIndex;if (this.staticData.sortType === "up") {this.staticData.sortType = "down";} else {this.staticData.sortType = "up";}},sortList(e) {var index = e.target.cellIndex;if (this.staticData.sortType === "up") {this.data.bookData.sort(function(a, b) {return a[index].charCodeAt(0) > b[index].charCodeAt(0) ? 1 : -1;})} else {this.data.bookData.sort(function(a, b) {return a[index].charCodeAt(0) < b[index].charCodeAt(0) ? 1 : -1;})}this.data.bookData = this.data.bookData;},getSortSign() {if (this.staticData.sortType === "up") {return '\u2191';} else {return '\u2193';}},handleBlockOndblclick(e) {if (!this.staticData.isOpenEdit) {this.staticData.isOpenEdit = true;this.data.edit = {row: parseInt(e.target.dataset.row),cell: parseInt(e.target.dataset.cell)}}},save(e) {e.preventDefault();var input = e.target.firstChild;this.staticData.isOpenEdit = false;this.data.edit = {row: -1,cell: -1}this.data.bookData[e.target.dataset.row][e.target.dataset.cell] = input.value;this.data.bookData = this.data.bookData;}},data: {bookHeader: ["Book", "Author", "Language", "Published", "Sales"],bookData: [["The Lord of the Rings", "    J. R. R. Tolkien", "English", "1954-1955", "150 million"],["The Little Prince", "Antoine de Saint-Exupéry", "French", "1943", "140 million"],["Dream of the Red Chamber", "Cao Xueqin", "Chinese", "1791", "100 million"]],edit: {row: -1,cell: -1}},staticData: {sortBy: -1,sortType: 'down',isOpenEdit: false}
})
Ale.render("excel", {el: "#app"
})

如果想了解更多,欢迎关注我在明天推出的第四篇教程,同时也关注一下 alejs 哦,感谢各位!

(非常重要:如果有能力的话不妨去 Github 或 码云 上 star 一下我们吧!不过如果您特别喜欢 alejs 的话也可以 watch 或 fork 一下哦!十分感谢!)

使用 ale.js 制作一个小而美的表格编辑器(3)相关推荐

  1. 使用 ale.js 制作一个小而美的表格编辑器(2)

    今天来教大家如何使用 ale.js 制作一个小而美的表格编辑器,首先先上 gif: 是不是还是有一点非常 cool 的感觉的?那么我们现在开始吧! 这是我们这篇文章结束后完成的效果(如果想继续完成请访 ...

  2. 使用 ale.js 制作一个小而美的表格编辑器(1)

    今天来教大家如何使用 ale.js 制作一个小而美的表格编辑器,首先先上 gif: 是不是还是有一点非常 cool 的感觉的?那么我们现在开始吧! 这是我们这篇文章结束后完成的效果(如果想继续完成请访 ...

  3. 使用 ale.js 制作一个小而美的表格编辑器(4)

    今天来教大家如何使用 ale.js 制作一个小而美的表格编辑器,首先先上 gif: 是不是还是有一点非常 cool 的感觉的?那么我们现在开始吧! 这是我们这篇文章结束后完成的效果(如果想继续完成请访 ...

  4. jsp循环输出表格_使用 ale.js 制作一个小而美的表格编辑器(1)

    今天来教大家如何使用 ale.js 制作一个小而美的表格编辑器,首先先上 gif: 是不是还是有一点非常 cool 的感觉的?那么我们现在开始吧! 这是我们这篇文章结束后完成的效果(如果想继续完成请访 ...

  5. 用JS制作一个信息管理平台完整版

      前  言 JRedu 在之前的文章中,介绍了如何用JS制作一个实用的信息管理平台. 但是那样的平台功能过于简陋了,我们今天来继续完善一下. 首先我们回顾一下之前的内容.   1.JSON的基础知识 ...

  6. 使用 Vue.js 制作一个简单的调查问卷平台

    使用 Vue.js 制作一个简单的调查问卷平台 原文  https://github.com/pramper/Demos/tree/master/Vue-Demos/Questionnaire 主题  ...

  7. 用html和js制作一个控制灯泡开关效果

    用html和js制作一个控制灯泡开关效果 **用css样式来控制div图片和文本的位置,然后用js里面onclick点击事件来控制图片的更换效果来实现当前运行图的效果** 1.以下是运行的效果图 2. ...

  8. 如何用JAVA制作一个漂亮的表格

    如何用JAVA制作一个漂亮的表格 表格图片: 选中一行时高亮显示,且字体变为红色: 在表格中添加数据: 代码如下: import java.awt.BorderLayout; import java. ...

  9. 教你用html+js制作一个自己的点名系统,实例代码分享

    简介 教你用html+js制作一个自己的点名系统,实例代码如下. 效果 代码 HTML <div class="wrapper"><h1 align=" ...

最新文章

  1. 求13-23+33……-1003(3.6)(Java)
  2. 在.net中如何禁用或启用DropDownList的Items
  3. vue中echarts 5.0版本以上不支持因为官方移除了地图数据和map文件夹
  4. C++ -- vector详解
  5. java代码实现顺序队列
  6. HDU 4983 Goffi and GCD(数论)
  7. vite:15个插件推荐
  8. Python 练习题
  9. 计算机软件登记委托开发合同,软件委托开发合同
  10. 题解 UVA1449 【Dominating Patterns】
  11. java nifty_java-jMonkey和Nifty中的线程?
  12. Photoshop学习心得
  13. ih5手机版怎么登录服务器未响应,ih5 与服务器链接教程
  14. Mac 安装MySQL到移动硬盘
  15. 阿里巴巴国际站产品标题的组合和优化方法一览
  16. 王者荣耀服务器维护9月27,王者荣耀9月27日更新维护公告 修复夏洛特技能bug等...
  17. python 发送邮件正文字体设置_smtplib文字邮件的发送
  18. 搜网页显示未连接上服务器是什么,【科普君】网页搜索时,出现“404”到底是什么意思?...
  19. 解读!《国家职业教育改革实施方案》要点来啦!
  20. 如何解决七牛云图片链接失效问题?

热门文章

  1. Debug时含有的子元素,在代码里获取不到的问题
  2. [HTML]JS添加表格
  3. 实习生笔试面试题总结
  4. 最短路径问题 java实现 源代码
  5. linux 里常用的几个查找命令
  6. IOS网址解析-demo
  7. mysql常用的函数
  8. 【oracle笔记3】多表查询
  9. MATLAB 的条件分支语句
  10. 根据ip获取用户地址-百度