jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera


Posted in Javascript onAugust 28, 2009

要实现可编辑的表格功能,我们要解决以下问题:
1.明确要修改的数据在表格中是哪些列(如何找到这些单元格);
2.如何让单元格变成可以编辑的;
3.如何处理单元格的一些按键事件;
4.解决跨浏览器问题。
我们通过jQuery可以一步一步解决上述问题。
一、 绘制表格
首先我们先画好一个表格。
Code1:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>jQuery的跨浏览器可编辑表格</title> 
<link rel="stylesheet" type="text/css" href="css/editTable.css" media="all"/> 
<script type="text/javascript" src="js/jquery-1.3.2.min.js"></script> 
<script type="text/javascript" src="js/editTable.js"></script> 
</head> 
<body> 
<table> 
<thead> 
<tr> 
<th colspan="2">鼠标点击表格就可以编辑</th> 
</tr> 
</thead> 
<tbody> 
<tr> 
<th>学号</th> 
<th>姓名</th> 
</tr> 
<tr> 
<td>000001</td> 
<td>张三</td> 
</tr> 
<tr> 
<td>000002</td> 
<td>李四</td> 
</tr> 
<tr> 
<td>000003</td> 
<td>王五</td> 
</tr> 
<tr> 
<td>000004</td> 
<td>赵六</td> 
</tr> 
</tbody> 
</table> 
</body> 
</html>

画好表格以后显示的如图:
editTable01.jpg
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera 
很明显它看起来不像一个表格,既没有边框,而且很丑。那么我们先给这个表格设置一些样式。
Code2:
body{}{ 
font-size: 14px; 
} 
table{}{ 
color: #4F6B72; 
border: 1px solid #C1DAD7; 
border-collapse: collapse; 
width: 400px; 
} 
th{}{ 
width: 50%; 
border: 1px solid #C1DAD7; 
} 
td{}{ 
width: 50%; 
border: 1px solid #C1DAD7; 
}

现在效果好多了:
editTable02.jpg
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera     
但是单元格和单元格之间还是有重叠的边框,只需要在标签选择符table中加上这样一个属性就能去除重复边框:
border-collapse: collapse;
table{}{ 
color: #4F6B72; 
border: 1px solid #C1DAD7; 
border-collapse: collapse; 
width: 400px; 
}

editTable03.jpg
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
二、 让表格的单元格变成可编辑的列
绘制好表格以后,我们选取表格中的编号列作为可编辑的列。要让这一列的单元格能够被编辑,就需要在这些列中插入文本框,我们通过这一列单元格的onclick事件来插入文本框。
Code3:
$(document).ready(function(){ 
//找到学号这一列的所有单元格 
//因为学号这一列的单元格在所有td中的位置是偶数(0,2,4,6),所以通过even就可以筛选到td中偶数位的单元格 
var numTd = $("tbody td:even"); 
//单击这些td时,创建文本框 
numTd.click(function(){ 
//创建文本框对象 
var inputobj = $("<input type='text'>"); 
//获取当前点击的单元格对象 
var tdobj = $(this); 
//去除文本框的border 
inputobj.css("border","0"); 
//让文本框和单元格的宽度保持一致 
inputobj.width(tdobj.width()); 
//让文本框的字体和单元格的字体大小一样 
inputobj.css("font-size",tdobj.css("font-size")); 
//让文本框和单元格的字体保持一致 
inputobj.css("font-family",tdobj.css("font-family")); 
//让文本框和单元格的背景保持一致 
inputobj.css("background-color",tdobj.css("background-color")); 
//appendTo方法把文本框添加到td中 
inputobj.appendTo(tdobj); 
}); 
});

现在已经把文本框插入到单元格中了。既然要编辑文本框,文本框就应该有值,文本框的值来源于单元格中的数据,并且我们要清空单元格中原有的数据。
Code4:
$(document).ready(function(){ 
//找到学号这一列的所有单元格 
//因为学号这一列的单元格在所有td中的位置是偶数(0,2,4,6),所以通过even就可以筛选到td中偶数位的单元格 
var numTd = $("tbody td:even"); 
//单击这些td时,创建文本框 
numTd.click(function(){ 
//创建文本框对象 
var inputobj = $("<input type='text'>"); 
//获取当前点击的单元格对象 
var tdobj = $(this); 
//获取单元格中的文本 
var text = tdobj.html(); 
//清空单元格的文本 
tdobj.html(""); 
//去除文本框的border 
inputobj.css("border","0"); 
//让文本框和单元格的宽度保持一致 
inputobj.width(tdobj.width()); 
//让文本框的字体和单元格的字体大小一样 
inputobj.css("font-size",tdobj.css("font-size")); 
//让文本框和单元格的字体保持一致 
inputobj.css("font-family",tdobj.css("font-family")); 
//让文本框和单元格的背景保持一致 
inputobj.css("background-color",tdobj.css("background-color")); 
inputobj.css("color","#C75F3E"); 
//给文本框赋值 
inputobj.val(text); 
//appendTo方法把文本框添加到td中 
inputobj.appendTo(tdobj); 
}); 
});

但是以上代码看起来非常的繁琐,jQuery有一个非常好的优点,就是它的代码连缀。上面的代码可以通过连缀进行简化:
Code5:
$(document).ready(function(){ 
//找到学号这一列的所有单元格 
//因为学号这一列的单元格在所有td中的位置是偶数(0,2,4,6),所以通过even就可以筛选到td中偶数位的单元格 
var numTd = $("tbody td:even"); 
//单击这些td时,创建文本框 
numTd.click(function(){ 
//创建文本框对象 
var inputobj = $("<input type='text'>"); 
//获取当前点击的单元格对象 
var tdobj = $(this); 
//获取单元格中的文本 
var text = tdobj.html(); 
//清空单元格的文本 
tdobj.html(""); 
inputobj.css("border","0") 
.css("font-size",tdobj.css("font-size")) 
.css("font-family",tdobj.css("font-family")) 
.css("background-color",tdobj.css("background-color")) 
.css("color","#C75F3E") 
.width(tdobj.width()) 
.val(text) 
.appendTo(tdobj); 
}); 
});

现在表格中已经成功的插入了文本框,可以对单元格进行编辑了。
editTable04.jpg
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera       
    但是有个明显的bug,当你再次点击同一个单元格时,会出现如下效果:

        editTable05.jpg

      
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera 
是什么原因造成上面这个bug呢?因为在文本框中插入单元格之后,文本框是属于单元格的,我们点击文本框时,同样会触发单元格的click事件。
我们需要阻止文本框的点击行为(阻止事件冒泡)。
Code6:

inputobj.click(function(){ 
return false; 
});

但是点击单元格的边框时,还是会出现上述的bug,那我们做如下判断:如果单元格中已经插入了文本框,就跳出click事件。
Code7:
$(document).ready(function(){ 
//找到学号这一列的所有单元格 
//因为学号这一列的单元格在所有td中的位置是偶数(0,2,4,6),所以通过even就可以筛选到td中偶数位的单元格 
var numTd = $("tbody td:even"); 
//单击这些td时,创建文本框 
numTd.click(function(){ 
//创建文本框对象 
var inputobj = $("<input type='text'>"); 
//获取当前点击的单元格对象 
var tdobj = $(this); 
//获取单元格中的文本 
var text = tdobj.html(); 
//如果当前单元格中有文本框,就直接跳出方法 
//注意:一定要在插入文本框前进行判断 
if(tdobj.children("input").length>0){ 
return false; 
} 
//清空单元格的文本 
tdobj.html(""); 
inputobj.css("border","0") 
.css("font-size",tdobj.css("font-size")) 
.css("font-family",tdobj.css("font-family")) 
.css("background-color",tdobj.css("background-color")) 
.css("color","#C75F3E") 
.width(tdobj.width()) 
.val(text) 
.appendTo(tdobj); 
inputobj.get(0).select(); 
//阻止文本框的点击事件 
inputobj.click(function(){ 
return false; 
}); 
}); 
});

上面的bug解决了,但是我发现,点击单元格时,虽然从表面上看文字是变了色,但没有让我觉得它是能被编辑的。那么我就做一点点的改动,插入文本框的同时,选中文本框的文本。
Code 8:
inputobj.get(0).select();

但是问题又来了,在Safari浏览器中,要让文本框处于选中状态,必须显得让文本框获得焦点。而我们这里只是在点击单元格时,插入文本框并给文本框赋值,文本框并没有获得焦点。解决的方法:通过jQuery的trigger方法来触发某个事件。
Code9:
inputobj.trigger("focus").trigger("select");

三、文本框按键事件处理
以上的这些问题解决了,那我们就再来给文本框添加一些按键事件。我们知道不同的浏览器中获取按键的keyCode是不同的,但是jQuery帮我们解决了这个问题。
只需要在事件的function中加入event参数,然后在方法体中,通过event对象的which属性就能获得keyCode,event.which属性同化了不同浏览器获取keyCode的方法。
获得keyCode之后,我主要做两个按键事件:ESC键(键值:27)和Enter键(键值:13)。
Code10:
//处理文本框上回车和esc按键的操作 
//jQuery中某个事件方法的function可以定义一个event参数,jQuery会屏蔽浏览器的差异,传递给我们一个可用的event对象 
inputobj.keyup(function(event){ 
//获取当前按键的键值 
//jQuery的event对象上有一个which的属性可以获得键盘按键的键值 
var keycode = event.which; 
//处理回车的情况 
if(keycode==13){ 
//获取当前文本框的内容 
var inputtext = $(this).val(); 
//将td的内容修改成文本框中的内容 
tdobj.html(inputtext); 
} 
//处理esc的情况 
if(keycode == 27){ 
//将td中的内容还原成text 
tdobj.html(text); 
} 
});

下面是完整的js代码:
Code11:
$(document).ready(function(){ 
//找到学号这一列的所有单元格 
//因为学号这一列的单元格在所有td中的位置是偶数(0,2,4,6),所以通过even就可以筛选到td中偶数位的单元格 
var numTd = $("tbody td:even"); 
//单击这些td时,创建文本框 
numTd.click(function(){ 
//创建文本框对象 
var inputobj = $("<input type='text'>"); 
//获取当前点击的单元格对象 
var tdobj = $(this); 
//获取单元格中的文本 
var text = tdobj.html(); 
//如果当前单元格中有文本框,就直接跳出方法 
//注意:一定要在插入文本框前进行判断 
if(tdobj.children("input").length>0){ 
return false; 
} 
//清空单元格的文本 
tdobj.html(""); 
inputobj.css("border","0") 
.css("font-size",tdobj.css("font-size")) 
.css("font-family",tdobj.css("font-family")) 
.css("background-color",tdobj.css("background-color")) 
.css("color","#C75F3E") 
.width(tdobj.width()) 
.val(text) 
.appendTo(tdobj); 
inputobj.get(0).select(); 
//阻止文本框的点击事件 
inputobj.click(function(){ 
return false; 
}); 
//处理文本框上回车和esc按键的操作 
//jQuery中某个事件方法的function可以定义一个event参数,jQuery会屏蔽浏览器的差异,传递给我们一个可用的event对象 
inputobj.keyup(function(event){ 
//获取当前按键的键值 
//jQuery的event对象上有一个which的属性可以获得键盘按键的键值 
var keycode = event.which; 
//处理回车的情况 
if(keycode==13){ 
//获取当前文本框的内容 
var inputtext = $(this).val(); 
//将td的内容修改成文本框中的内容 
tdobj.html(inputtext); 
} 
//处理esc的情况 
if(keycode == 27){ 
//将td中的内容还原成text 
tdobj.html(text); 
} 
}); 
}); 
});

相关文档打包下载

Javascript 相关文章推荐
jquery ajax提交整个表单元素的快捷办法
Mar 27 Javascript
jQuery函数的等价原生函数代码示例
May 27 Javascript
jQuery计算textarea中文字数(剩余个数)的小程序
Nov 28 Javascript
100个不能错过的实用JS自定义函数
Mar 05 Javascript
封装好的js判断操作系统与浏览器代码分享
Jan 09 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
May 10 Javascript
js canvas实现擦除动画
Jul 16 Javascript
微信小程序 高德地图SDK详解及简单实例(源码下载)
Jan 11 Javascript
详解AngularJS1.6版本中ui-router路由中/#!/的解决方法
May 22 Javascript
JS实现的哈夫曼编码示例【原始版与修改版】
Apr 22 Javascript
如何手写一个简易的 Vuex
Oct 10 Javascript
JavaScript Blob对象原理及用法详解
Oct 14 Javascript
javascript 遍历验证所有文本框的值
Aug 27 #Javascript
JQuery 浮动导航栏实现代码
Aug 27 #Javascript
jQuery ui1.7 dialog只能弹出一次问题
Aug 27 #Javascript
JSON 客户端和服务器端的格式转换
Aug 27 #Javascript
动态表格Table类的实现
Aug 26 #Javascript
javascript 函数调用规则
Aug 26 #Javascript
JSON 入门指南 想了解json的朋友可以看下
Aug 26 #Javascript
You might like
学习php分页代码实例
2013/10/24 PHP
php curl登陆qq后获取用户信息时证书错误
2015/02/03 PHP
CI框架中类的自动加载问题分析
2016/11/21 PHP
yii2实现分页,带搜索的分页功能示例
2017/01/07 PHP
php实现微信扫码支付
2017/03/26 PHP
YII2框架中actions的作用与使用方法示例
2020/03/13 PHP
写的htc的数据表格
2007/01/20 Javascript
jQuery ready函数滥用分析
2011/02/16 Javascript
一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)
2011/09/19 Javascript
js下拉框二级关联菜单效果代码具体实现
2013/08/03 Javascript
js的隐含参数(arguments,callee,caller)使用方法
2014/01/28 Javascript
JavaScript获取路径设计源码
2014/05/22 Javascript
jquery中push()的用法(数组添加元素)
2014/11/25 Javascript
JavaScript对象之深度克隆介绍
2014/12/08 Javascript
JS和css实现检测移动设备方向的变化并判断横竖屏幕
2015/05/25 Javascript
javascript实现状态栏文字首尾相接循环滚动的方法
2015/07/22 Javascript
JavaScript运行过程中的“预编译阶段”和“执行阶段”
2015/12/16 Javascript
Bootstrap进度条学习使用
2017/02/09 Javascript
javascript 实现文本使用省略号替代(超出固定高度的情况)
2017/02/21 Javascript
jQuery 1.9版本以上的浏览器判断方法代码分享
2017/08/28 jQuery
在 Typescript 中使用可被复用的 Vue Mixin功能
2018/04/17 Javascript
vue嵌套路由与404重定向实现方法分析
2018/05/04 Javascript
JS运算符简单用法示例
2020/01/19 Javascript
npm qs模块使用详解
2020/02/07 Javascript
京东优选小程序的实现代码示例
2020/02/25 Javascript
教你用python3根据关键词爬取百度百科的内容
2016/08/18 Python
shelve  用来持久化任意的Python对象实例代码
2016/10/12 Python
python中yaml配置文件模块的使用详解
2018/04/27 Python
Python实现确认字符串是否包含指定字符串的实例
2018/05/02 Python
Python基础知识点 初识Python.md
2019/05/14 Python
大学生自助营养快餐店创业计划书
2014/01/13 职场文书
《音乐之都维也纳》教学反思
2014/04/16 职场文书
征兵宣传标语
2014/06/20 职场文书
安全环保演讲稿
2014/08/28 职场文书
《富饶的西沙群岛》教学反思
2016/02/16 职场文书
如何解决.cuda()加载用时很长的问题
2021/05/24 Python