今天的任务是开发可编辑的表格的模块,效果大致如图:
上图是一张梁山好汉的排名坐次表,当鼠标点击表格人物姓名那一列时,既可进入编辑状态。可对好汉姓名进行修改,按回车键可进行保存,按ESC键可以恢复到先前状态。
首先将表格划分为thead和tbody部分,thead显示“可编辑的梁山好汉排名”一行。座次和姓名这两格可以放在tbody的th中。草图如下:
<table>
<thead>
<tr><th colspan="2">可编辑的梁山好汉排名</th></tr>
</thead>
<tbody>
<tr><th>座次</th><th>姓名</th></tr>
<tr><td>1</td><td>宋江</td></tr>
<tr><td>2</td><td>卢俊义</td></tr>
<tr><td>3</td><td>吴用</td></tr>
<tr><td>4</td><td>公孙胜</td></tr>
<tr><td>5</td><td>关胜</td></tr>
<tr><td>6</td><td>林冲</td></tr>
</tbody>
</table>
这里的thead存放那个合并的主题,而表头存放在第一行tr的th中。此时的表格看起来比较丑陋,需要用css样式进行约束。
table {
border: 1px black solid;
border-collapse: collapse;
width: 400px;
}
table td {
border: 1px black solid;
width: 50%;
}
table th {
border: 1px black solid;
width: 50%;
}
tbody th {
background-color: #A3BAE9;
}
第一个样式table,属于标签选择器,对整个的table都起到渲染的作用,border属性的作用是给表格加大小为1个像素的边框,border-collapse: collapse让表格单元格的边框合并,而整个表格的大小等于400个像素。tbody th是为了给表头加背景颜色。
此时的效果如图
下一步是让表格颜色能够隔行显示颜色,我们把这一功能的实现可以放在editTable.js里面来实现,因为css实现这一效果比较困难,而jQuery提提供了对应的api。
jQuery :even 选择器
定义和用法
:even 选择器选取每个带有偶数 index 值的元素(比如 2、4、6)。index 值从 0 开始,所有第一个元素是偶数 (0)。
最常见的用法:与其他元素/选择器一起使用,来选择指定的组中偶数序号的元素(如上面的例子)。
需要注意的是,选择器的计数并不是从1还是得,而是从0开始。所以,对偶数行的选择语法是$(“tbody tr:even”),选取出来之后用节点.css方法给对应的行添加背景颜色。
var numTd = $("tbody tr:even");
numTd.css("background-color", "#ECE9D8");
如果想把最后一行的背景颜色换成和head一样的颜色,可以使用:last选择器,语法如下:
jQuery :last 选择器
定义和用法
:last 选择器选取最后一个元素。最常见的用法:与其他元素一起使用,选取指定组合中的最后一个元素(就像上面的例子)。
语法:
$(“:last”)
本例子,实现的代码如下:
$("tbody tr:last").css("background-color", "#A3BAE9");
到此为止,页面渲染差不多了,接着应该是监听鼠标事件.
//我们需要找到所有的人物姓名单元格
var numTd = $("tbody td:even");
//给这些单元格注册鼠标点击的事件
numTd.click(function() {
//找到当前鼠标点击的td,this对应的就是响应了click的那个td
var tdObj = $(this);
if (tdObj.children("input").length > 0) {
//当前td中input,不执行click处理
return false;
}
var text = tdObj.html();
//清空td中的内容
tdObj.html("");
//创建一个文本框
//去掉文本框的边框
//设置文本框中的文字字体大小是16px
//使文本框的宽度和td的宽度相同
//设置文本框的背景色
//需要将当前td中的内容放到文本框中
//将文本框插入到td中
var inputObj = $("<input type='text'>").css("border-width","0")
.css("font-size","16px").width(tdObj.width())
.css("background-color",tdObj.css("background-color"))
.val(text).appendTo(tdObj);
});
这里有一个小的bug,当鼠标第一次点击姓名的时候,td会添加input节点,但是input并没有相应单击事件。所以这里要重新绑定获取焦点到input元素上面。
inputObj.trigger("focus").trigger("select");
inputObj.click(function() {
return false;
});
开始监听键盘按下事件和esc事件
inputObj.keypress(function(event) {
var keyCode = event.keyCode;
if(13 == keyCode) {
var inputText = $(this).val();
tdObj.html(inputText);
} else if(27 == keyCode){
tdObj.html(text);
}
});
本节知识点回顾:
- table中可以包含thead和tbody
- 表头的内容可以放到th中
- table{}这种写法称作标签选择器,可以对整个页面所有table产生影响。
- table td{}这种写法表示的是table中包含的所有td。
- 可以通过border-collapse: collapse这种方式来使表格中的单元格的边框合并。
- 当th上由背景色时,这个th属于的tr上定义的背景色会无效。
- $(“tbody tr”)可以返回tbody中的所有tr节点
- $(“tbody tr:even”)可以返回tbody中所有索引值是偶数的tr节点
- css方法可以用于设定或获取节点的css属性,参数名是css的属性名。
- JQuery的对象内容包含着选择器对应的DOM节点,以数组形式保存
- get方法可以获得JQuery对象中包含的某一个DOM节点
- function中的this代表执行这个function的对象
- $()方法的参数是一个DOM对象时,这个方法相当于把DOM对象转换成JQuery对象。
- children方法可以获得某个节点的子节点,可以制定参数来限制子节点的内容。
- 如果选择器返回的JQuery对象中包含多个DOM节点,在这个对象上注册类似click这样的事件时,所有DOM节点都会用于事件
- html方法可以设置或获取节点的HTML内容
- val方法可以获取或设置节点的value值
- $()方法的参数如果是一段正确的HTML文本,则可以创建一个DOM节点,并包装成JQuery对象
- JQuery大部分方法都会返回执行这个方法的JQuery对象,因此可以采用链式方法的写法来编写给予JQuery的代码。
- width方法可以设置或获取某个节点的宽度
- appendTo方法可以将一个节点追加到另一个节点所有子节点的后面
- 阻止事件传递可以让当前节点的事件返回false
- trigger方法可以触发某个javascript的事件发生。
- JQuery中某个事件方法的参数function上可以定义一个event的参数,JQuery会屏蔽浏览器的event差异,传给我们一个可用的event对象
- JQuery的event对象上有一个which的属性可以获得键盘按键的键值
- 13表示回车键,27表示ESC键
代码下载地址:https://github.com/shizongger/JqueryInAction
参考资料:
jquery参考文档
王兴奎《jQuery实战》