js实现可编辑表单

在修改数据时,有时候为了方便,我们希望能够直接在表格里面对数据进行直接修改。

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

    我们通过jQuery可以一步一步解决上述问题。
    

一、    绘制表格

首先我们先画好一个表格。

    Code1:
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>jQuery的跨浏览器可编辑表格</title>
  6. <link rel="stylesheet" type="text/css" href="css/editTable.css" media="all"/>
  7. <script type="text/javascript" src="js/jquery-1.3.2.min.js"></script>
  8. <script type="text/javascript" src="js/editTable.js"></script>
  9. </head>

  10. <body>
  11.     <table>
  12.         <thead>
  13.             <tr>
  14.                 <th colspan="2">鼠标点击表格就可以编辑</th>
  15.             </tr>
  16.         </thead>
  17.         <tbody>
  18.             <tr>
  19.                 <th>学号</th>
  20.                 <th>姓名</th>
  21.             </tr>
  22.             <tr>
  23.                 <td>000001</td>
  24.                 <td>张三</td>
  25.             </tr>
  26.             <tr>
  27.                 <td>000002</td>
  28.                 <td>李四</td>
  29.             </tr>
  30.             <tr>
  31.                 <td>000003</td>
  32.                 <td>王五</td>
  33.             </tr>
  34.             <tr>
  35.                 <td>000004</td>
  36.                 <td>赵六</td>
  37.             </tr>
  38.         </tbody>
  39.     </table>
  40. </body>
  41. </html>
复制代码
画好表格以后显示的如图:

      editTable01.jpg
      
jQuery一步一步实现跨浏览器的可编辑表格_20593


      很明显它看起来不像一个表格,既没有边框,而且很丑。那么我们先给这个表格设置一些样式。

      Code2:
  1. body{}{
  2.     font-size: 14px;
  3. }
  4. table{}{
  5.     color: #4F6B72; 
  6.     border: 1px solid #C1DAD7;
  7.     border-collapse: collapse;
  8.     width: 400px;
  9. }

  10. th{}{
  11.     width: 50%;
  12.     border: 1px solid #C1DAD7;
  13. }
  14. td{}{
  15.     width: 50%;
  16.     border: 1px solid #C1DAD7;
  17. }
复制代码
现在效果好多了:

      editTable02.jpg

jQuery一步一步实现跨浏览器的可编辑表格_20594

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


      border-collapse: collapse;
  1. table{}{
  2.     color: #4F6B72; 
  3.     border: 1px solid #C1DAD7;
  4.     border-collapse: collapse;
  5.     width: 400px;
  6. }
复制代码
editTable03.jpg

jQuery一步一步实现跨浏览器的可编辑表格_20595
TOP
 

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



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

      Code3:
  1. $(document).ready(function(){
  2.     //找到学号这一列的所有单元格
  3.     //因为学号这一列的单元格在所有td中的位置是偶数(0,2,4,6),所以通过even就可以筛选到td中偶数位的单元格
  4.     var numTd = $("tbody  td:even");
  5.     
  6.     //单击这些td时,创建文本框
  7.     numTd.click(function(){
  8.         //创建文本框对象
  9.         var inputobj = $("<input type='text'>");
  10.         //获取当前点击的单元格对象
  11.         var tdobj = $(this);
  12.         
  13.         //去除文本框的border
  14.         inputobj.css("border","0");
  15.         //让文本框和单元格的宽度保持一致
  16.         inputobj.width(tdobj.width());
  17.         //让文本框的字体和单元格的字体大小一样
  18.         inputobj.css("font-size",tdobj.css("font-size"));
  19.         //让文本框和单元格的字体保持一致
  20.         inputobj.css("font-family",tdobj.css("font-family"));
  21.         //让文本框和单元格的背景保持一致
  22.         inputobj.css("background-color",tdobj.css("background-color"));
  23.         
  24.         //appendTo方法把文本框添加到td中
  25.         inputobj.appendTo(tdobj);
  26.     });
  27. });
复制代码
现在已经把文本框插入到单元格中了。既然要编辑文本框,文本框就应该有值,文本框的值来源于单元格中的数据,并且我们要清空单元格中原有的数据。

      Code4:
  1. $(document).ready(function(){
  2.     //找到学号这一列的所有单元格
  3.     //因为学号这一列的单元格在所有td中的位置是偶数(0,2,4,6),所以通过even就可以筛选到td中偶数位的单元格
  4.     var numTd = $("tbody  td:even");
  5.     
  6.     //单击这些td时,创建文本框
  7.     numTd.click(function(){
  8.         //创建文本框对象
  9.         var inputobj = $("<input type='text'>");
  10.         //获取当前点击的单元格对象
  11.         var tdobj = $(this);
  12.         //获取单元格中的文本
  13.         var text = tdobj.html();
  14.         
  15.         //清空单元格的文本
  16.         tdobj.html("");
  17.         
  18.         //去除文本框的border
  19.         inputobj.css("border","0");
  20.         //让文本框和单元格的宽度保持一致
  21.         inputobj.width(tdobj.width());
  22.         //让文本框的字体和单元格的字体大小一样
  23.         inputobj.css("font-size",tdobj.css("font-size"));
  24.         //让文本框和单元格的字体保持一致
  25.         inputobj.css("font-family",tdobj.css("font-family"));
  26.         //让文本框和单元格的背景保持一致
  27.         inputobj.css("background-color",tdobj.css("background-color"));
  28.         inputobj.css("color","#C75F3E");
  29.         
  30.         //给文本框赋值
  31.         inputobj.val(text);
  32.         
  33.         //appendTo方法把文本框添加到td中
  34.         inputobj.appendTo(tdobj);
  35.     });
  36. });
复制代码
但是以上代码看起来非常的繁琐,jQuery有一个非常好的优点,就是它的代码连缀。上面的代码可以通过连缀进行简化:

      Code5:
  1. $(document).ready(function(){
  2.     //找到学号这一列的所有单元格
  3.     //因为学号这一列的单元格在所有td中的位置是偶数(0,2,4,6),所以通过even就可以筛选到td中偶数位的单元格
  4.     var numTd = $("tbody  td:even");
  5.     
  6.     //单击这些td时,创建文本框
  7.     numTd.click(function(){
  8.         //创建文本框对象
  9.         var inputobj = $("<input type='text'>");
  10.         //获取当前点击的单元格对象
  11.         var tdobj = $(this);
  12.         //获取单元格中的文本
  13.         var text = tdobj.html();
  14.         
  15.         //清空单元格的文本
  16.         tdobj.html("");
  17.         
  18.         inputobj.css("border","0")
  19.                 .css("font-size",tdobj.css("font-size"))
  20.                 .css("font-family",tdobj.css("font-family"))
  21.                 .css("background-color",tdobj.css("background-color"))
  22.                 .css("color","#C75F3E")
  23.                 .width(tdobj.width())
  24.                 .val(text)
  25.                 .appendTo(tdobj);
  26.     });
  27. });
复制代码
现在表格中已经成功的插入了文本框,可以对单元格进行编辑了。

      editTable04.jpg 

_20596

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

        editTable05.jpg

_20597



      是什么原因造成上面这个bug呢?因为在文本框中插入单元格之后,文本框是属于单元格的,我们点击文本框时,同样会触发单元格的click事件。

      我们需要阻止文本框的点击行为(阻止事件冒泡)。

      Code6:
  1. inputobj.click(function(){
  2.             return false;
  3.         });
复制代码
但是点击单元格的边框时,还是会出现上述的bug,那我们做如下判断:如果单元格中已经插入了文本框,就跳出click事件。

      Code7:
  1. $(document).ready(function(){
  2.     //找到学号这一列的所有单元格
  3.     //因为学号这一列的单元格在所有td中的位置是偶数(0,2,4,6),所以通过even就可以筛选到td中偶数位的单元格
  4.     var numTd = $("tbody  td:even");
  5.     
  6.     //单击这些td时,创建文本框
  7.     numTd.click(function(){
  8.         //创建文本框对象
  9.         var inputobj = $("<input type='text'>");
  10.         //获取当前点击的单元格对象
  11.         var tdobj = $(this);
  12.         //获取单元格中的文本
  13.         var text = tdobj.html();
  14.         
  15.         //如果当前单元格中有文本框,就直接跳出方法
  16.         //注意:一定要在插入文本框前进行判断
  17.         if(tdobj.children("input").length>0){
  18.             return false;
  19.         }
  20.         //清空单元格的文本
  21.         tdobj.html("");
  22.         
  23.         inputobj.css("border","0")
  24.                 .css("font-size",tdobj.css("font-size"))
  25.                 .css("font-family",tdobj.css("font-family"))
  26.                 .css("background-color",tdobj.css("background-color"))
  27.                 .css("color","#C75F3E")
  28.                 .width(tdobj.width())
  29.                 .val(text)
  30.                 .appendTo(tdobj);
  31.                 
  32.         inputobj.get(0).select();
  33.         //阻止文本框的点击事件
  34.         inputobj.click(function(){
  35.             return false;
  36.         });    
  37.     });
  38. });
复制代码
上面的bug解决了,但是我发现,点击单元格时,虽然从表面上看文字是变了色,但没有让我觉得它是能被编辑的。那么我就做一点点的改动,插入文本框的同时,选中文本框的文本。

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

      Code9:
  1. inputobj.trigger("focus").trigger("select");
复制代码
TOP
 

三、文本框按键事件处理    

以上的这些问题解决了,那我们就再来给文本框添加一些按键事件。我们知道不同的浏览器中获取按键的keyCode是不同的,但是jQuery帮我们解决了这个问题。

      只需要在事件的function中加入event参数,然后在方法体中,通过event对象的which属性就能获得keyCode,event.which属性同化了不同浏览器获取keyCode的方法。

      获得keyCode之后,我主要做两个按键事件:ESC键(键值:27)和Enter键(键值:13)。

      Code10:
  1.         //处理文本框上回车和esc按键的操作
  2.         //jQuery中某个事件方法的function可以定义一个event参数,jQuery会屏蔽浏览器的差异,传递给我们一个可用的event对象
  3.         inputobj.keyup(function(event){
  4.             //获取当前按键的键值
  5.             //jQuery的event对象上有一个which的属性可以获得键盘按键的键值
  6.             var keycode = event.which;
  7.             //处理回车的情况
  8.             if(keycode==13){
  9.                 //获取当前文本框的内容
  10.                 var inputtext = $(this).val();
  11.                 //将td的内容修改成文本框中的内容
  12.                 tdobj.html(inputtext);
  13.             }
  14.             //处理esc的情况
  15.             if(keycode == 27){
  16.                 //将td中的内容还原成text
  17.                 tdobj.html(text);
  18.             }
  19.         });
复制代码
下面是完整的js代码:

      Code11:
  1. $(document).ready(function(){
  2.     //找到学号这一列的所有单元格
  3.     //因为学号这一列的单元格在所有td中的位置是偶数(0,2,4,6),所以通过even就可以筛选到td中偶数位的单元格
  4.     var numTd = $("tbody  td:even");
  5.     
  6.     //单击这些td时,创建文本框
  7.     numTd.click(function(){
  8.         //创建文本框对象
  9.         var inputobj = $("<input type='text'>");
  10.         //获取当前点击的单元格对象
  11.         var tdobj = $(this);
  12.         //获取单元格中的文本
  13.         var text = tdobj.html();
  14.         
  15.         //如果当前单元格中有文本框,就直接跳出方法
  16.         //注意:一定要在插入文本框前进行判断
  17.         if(tdobj.children("input").length>0){
  18.             return false;
  19.         }
  20.         //清空单元格的文本
  21.         tdobj.html("");
  22.         
  23.         inputobj.css("border","0")
  24.                 .css("font-size",tdobj.css("font-size"))
  25.                 .css("font-family",tdobj.css("font-family"))
  26.                 .css("background-color",tdobj.css("background-color"))
  27.                 .css("color","#C75F3E")
  28.                 .width(tdobj.width())
  29.                 .val(text)
  30.                 .appendTo(tdobj);
  31.                 
  32.         inputobj.get(0).select();
  33.         //阻止文本框的点击事件
  34.         inputobj.click(function(){
  35.             return false;
  36.         });
  37.         
  38.         //处理文本框上回车和esc按键的操作
  39.         //jQuery中某个事件方法的function可以定义一个event参数,jQuery会屏蔽浏览器的差异,传递给我们一个可用的event对象
  40.         inputobj.keyup(function(event){
  41.             //获取当前按键的键值
  42.             //jQuery的event对象上有一个which的属性可以获得键盘按键的键值
  43.             var keycode = event.which;
  44.             //处理回车的情况
  45.             if(keycode==13){
  46.                 //获取当前文本框的内容
  47.                 var inputtext = $(this).val();
  48.                 //将td的内容修改成文本框中的内容
  49.                 tdobj.html(inputtext);
  50.             }
  51.             //处理esc的情况
  52.             if(keycode == 27){
  53.                 //将td中的内容还原成text
  54.                 tdobj.html(text);
  55.             }
  56.         });
  57.         
  58.     });
  59. });
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值