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

20090828002026332.JPG     

但是单元格和单元格之间还是有重叠的边框,只需要在标签选择符table中加上这样一个属性就能去除重复边框:

border-collapse: collapse;

table{}{

color: #4F6B72;

border: 1px solid #C1DAD7;

border-collapse: collapse;

width: 400px;

}

editTable03.jpg

20090828002026545.JPG

二、 让表格的单元格变成可编辑的列

绘制好表格以后,我们选取表格中的编号列作为可编辑的列。要让这一列的单元格能够被编辑,就需要在这些列中插入文本框,我们通过这一列单元格的onclick事件来插入文本框。

Code3:

$(document).ready(function(){

//找到学号这一列的所有单元格

//因为学号这一列的单元格在所有td中的位置是偶数(0,2,4,6),所以通过even就可以筛选到td中偶数位的单元格

var numTd = $("tbody td:even");

//单击这些td时,创建文本框

numTd.click(function(){

//创建文本框对象

var inputobj = $("");

//获取当前点击的单元格对象

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 = $("");

//获取当前点击的单元格对象

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 = $("");

//获取当前点击的单元格对象

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

20090828002026372.JPG       

但是有个明显的bug,当你再次点击同一个单元格时,会出现如下效果:

editTable05.jpg

20090828002026853.JPG 

是什么原因造成上面这个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 = $("");

//获取当前点击的单元格对象

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 = $("");

//获取当前点击的单元格对象

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);

}

});

});

});

相关文档打包下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值