一样的table?不一样的table(可编辑状态table)
首先完成html页面:
代码如下:
<!doctype html public "-//w3c//dtd html 4.01//en" "https://www.w3.org/tr/html4/strict.dtd">
<html xmlns="https://www.w3.org/1999/xhtml" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>jqueryproject1</title>
<meta name="author" content="frank_ren" />
<link type="text/css" rel="stylesheet" href="css/mycss.css" />
<script type="text/javascript" src="js/jquery-1.8.1.min.js"></script>
<script type="text/javascript" language="javascript" src="js/myjsfile.js"></script>
<!-- date: 2012-09-17 -->
</head>
<body>
<table>
<thead>
<tr>
<th colspan="2">鼠标点击下列内容可以进行编辑</th>
</tr>
</thead>
<tbody id="content">
<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>
没错现在它还是一个普通的table,一点样式都还没有,为了让这个table显得不那么抽象,接下来为它引入css样式
. 代码如下:
table{
width:400px;
height: 150px;
}
table, table td, table th{
border:1px solid black;
border-collapse: collapse;
}
table td{
width:50%;
height: 25px;
}
thead th{
background-color:#87cefa;
}
tbody th{
background-color:#fffacd;
}
在html页面中可编辑的页面元素就只有那么几个,很不幸table并不是其中一个,为了让table变得可编辑,就要向table中插入可编辑的页面元素,再用css装饰一下,让它看起来还是一个普通的table,然而却具备了可编辑的功能,这就是js所要完成的功能,js代码如下:
. 代码如下:
$(function(){
var content;
$("#content tr:odd").css("background-color","#d2b48c");
$("#content tr:even").css("background-color","#c0c0c0");
$("#content td").click(function(){
var clickobj = $(this);
content = clickobj.html();
changetoedit(clickobj);
});
function changetoedit(node){
node.html("");
var inputobj = $("<input type='text'/>");
inputobj.css("border","0").css("background-color",node.css("background-color"))
.css("font-size",node.css("font-size")).css("height","20px")
.css("width",node.css("width")).val(content).appendto(node)
.get(0).select();
inputobj.click(function(){
return false;
}).keyup(function(event){
var keyvalue = event.which;
if(keyvalue==13){
node.html(node.children("input").val());
}
if(keyvalue==27){
node.html(content);
}
}).blur(function(){
if(node.children("input").val()!=content){
if(confirm("是否保存修改的内容?","yes","no")){
node.html(node.children("input").val());
}else{
node.html(content);
}
}else{
node.html(content);
}
});
}
});
接下来对这段js做简单的分析,全局变量 var content 用于保存编辑之前表格中的内容,有时候用户对表格进行编辑了但却并不想保存编辑后的结果,就需要将表格中的内容还原到编辑之前,所以当鼠标点击的时候首先要将表格的内容保存起来。
下面这两句$("#content tr:odd").css("background-color","#d2b48c"); $("#content tr:even").css("background-color","#c0c0c0"); 是让table具备隔行变色,只是为了增加表格的可视性。var inputobj = $("<input type='text'/>"); 这一句生成一个可编辑的jquery对象,也就是要插入表格中的可编辑元素,后面那一串.css()方法是给inputobj对象追加css样式,.css()方法不仅可以给某个对象设置css样式还可以获取某个对象的css样式,jquery中提供了很多这样的方法。很多时候jquery方法执行过后返回回来的还是jquery对象,所以就出现了inputobj.css().css().css()....这样的写法。
appendto()方法就实现了表格的可编辑性(也可用appendix()),将可编辑元素插入到表格中。.get(0).select()这两个方法是为了选中inputobj中的内容让焦点落在可编辑元素上,需要注意的是这两个方法一定要写在appendto()之后,inputobj.click(function(){})这个方法也是必不可少的,删掉这个方法会有一个很有趣的bug,大家可以试一试。
紧接着的 keyup(function(event){}),可以通过 event.which 的方式获取键盘按下的键所对应的键值,常用的键值有 enter键:13、esc键:27,当用户按下enter键时,就保存编辑后的内容,并将表格还原成普通表格,当用户按下esc键时,将表格中的内容还原,也将表格还原成普通表格。
用户体验,苹果的出现让这个词更深入人心,这里也凑下热闹。为了提高用户体验这里增加了blur(function(){})方法,当焦点离开可编辑元素时首先判断表格中的内容是否被改变,如果没有改变直接将表格及表格中的还原,如果有改变就提示用户是否保存。
今天的示例基本完工了,如果你将js代码放在一个单独的js文件中引用,可能会出现一个中文乱码的bug,不妨动手试一试。谢谢你耐心的读完本文,希望对你会有所帮助。
推荐阅读
-
一样的table?不一样的table(可编辑状态table)
-
用div实现像table一样的布局方法
-
BootStrap Table复选框默认选中功能的实现代码(从数据库获取到对应的状态进行判断是否为选中状态)
-
bootstrap table实现x-editable的行单元格编辑及解决数据Empty和支持多样式问题
-
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
-
对Vue table 动态表格td可编辑的方法详解
-
element中table的表格更新数据之后保留原来的勾选状态
-
bootstrap table实现点击翻页功能 可记录上下页选中的行
-
动态渲染可编辑单元格的Table
-
ant desing vue table 实现可伸缩列的完整例子