找回密码
 立即注册
首页 业界区 业界 jQuery一步一步实现跨浏览器的可编辑表格 ...

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

迫蔺 2025-5-29 20:15:35
      在修改数据时,有时候为了方便,我们希望能够直接在表格里面对数据进行直接修改。
      要实现可编辑的表格功能,我们要解决以下问题:
            1.明确要修改的数据在表格中是哪些列(如何找到这些单元格);
            2.如何让单元格变成可以编辑的;
            3.如何处理单元格的一些按键事件;
            4.解决跨浏览器问题。

     我们通过jQuery可以一步一步解决上述问题。
     
 一、    绘制表格
 首先我们先画好一个表格。
     Code1:
1.gif
2.gif
Code
3.gif

4.gif

5.gif

6.gif

7.gif
jQuery的跨浏览器可编辑表格
8.gif

9.gif

10.gif

11.gif

12.gif

13.gif

14.gif
    
15.gif
        
16.gif
            
17.gif
                鼠标点击表格就可以编辑
18.gif
            
19.gif
        
20.gif
        
21.gif
            
22.gif
                学号
23.gif
                姓名
24.gif
            
25.gif
            
26.gif
                000001
27.gif
                张三
28.gif
            
29.gif
            
30.gif
                000002
31.gif
                李四
32.gif
            
33.gif
            
34.gif
                000003
35.gif
                王五
36.gif
            
37.gif
            
38.gif
                000004
39.gif
                赵六
40.gif
            
41.gif
        
42.gif
    
43.gif

44.gif

   画好表格以后显示的如图:
       editTable01.jpg
      

45.jpeg
 

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


46.gif
47.gif
Code
48.gif
49.gif
body{
50.png
}{
51.gif
    font-size: 14px;
52.gif
}
53.gif
54.gif
table{
55.png
}{
56.gif
    color: #4F6B72; 
57.gif
    border: 1px solid #C1DAD7;
58.gif
    border-collapse: collapse;
59.gif
    width: 400px;
60.gif
}
61.gif

62.gif
63.gif
th{
64.png
}{
65.gif
    width: 50%;
66.gif
    border: 1px solid #C1DAD7;
67.gif
}
68.gif
69.gif
td{
70.png
}{
71.gif
    width: 50%;
72.gif
    border: 1px solid #C1DAD7;
73.gif
}
       现在效果好多了:
       editTable02.jpg
       
74.jpeg
      
      
但是单元格和单元格之间还是有重叠的边框,只需要在标签选择符table中加上这样一个属性就能去除重复边框:

      border-collapse: collapse;       
75.gif
76.gif
table{
77.png
}{
78.gif
    color: #4F6B72; 
79.gif
    border: 1px solid #C1DAD7;
80.gif
    border-collapse: collapse;
81.gif
    width: 400px;
82.gif
}
      
editTable03.jpg

      
83.jpeg

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


84.gif
85.gif
Code
86.gif
87.gif
$(document).ready(function()
88.png
{
89.gif
    //找到学号这一列的所有单元格
90.gif
    //因为学号这一列的单元格在所有td中的位置是偶数(0,2,4,6),所以通过even就可以筛选到td中偶数位的单元格
91.gif
    var numTd = $("tbody  td:even");
92.gif
    
93.gif
    //单击这些td时,创建文本框
94.gif
95.gif
    numTd.click(function()
96.png
{
97.gif
        //创建文本框对象
98.gif
        var inputobj = $("");
99.gif
        //获取当前点击的单元格对象
100.gif
        var tdobj = $(this);
101.gif
        
102.gif
        //去除文本框的border
103.gif
        inputobj.css("border","0");
104.gif
        //让文本框和单元格的宽度保持一致
105.gif
        inputobj.width(tdobj.width());
106.gif
        //让文本框的字体和单元格的字体大小一样
107.gif
        inputobj.css("font-size",tdobj.css("font-size"));
108.gif
        //让文本框和单元格的字体保持一致
109.gif
        inputobj.css("font-family",tdobj.css("font-family"));
110.gif
        //让文本框和单元格的背景保持一致
111.gif
        inputobj.css("background-color",tdobj.css("background-color"));
112.gif
        
113.gif
        //appendTo方法把文本框添加到td中
114.gif
        inputobj.appendTo(tdobj);
115.gif
    });
116.gif
});
      
       现在已经把文本框插入到单元格中了。既然要编辑文本框,文本框就应该有值,文本框的值来源于单元格中的数据,并且我们要清空单元格中原有的数据。
       Code4:
       

117.gif
118.gif
Code
119.gif
120.gif
$(document).ready(function()
121.png
{
122.gif
    //找到学号这一列的所有单元格
123.gif
    //因为学号这一列的单元格在所有td中的位置是偶数(0,2,4,6),所以通过even就可以筛选到td中偶数位的单元格
124.gif
    var numTd = $("tbody  td:even");
125.gif
    
126.gif
    //单击这些td时,创建文本框
127.gif
128.gif
    numTd.click(function()
129.png
{
130.gif
        //创建文本框对象
131.gif
        var inputobj = $("");
132.gif
        //获取当前点击的单元格对象
133.gif
        var tdobj = $(this);
134.gif
        //获取单元格中的文本
135.gif
        var text = tdobj.html();
136.gif
        
137.gif
        //清空单元格的文本
138.gif
        tdobj.html("");
139.gif
        
140.gif
        //去除文本框的border
141.gif
        inputobj.css("border","0");
142.gif
        //让文本框和单元格的宽度保持一致
143.gif
        inputobj.width(tdobj.width());
144.gif
        //让文本框的字体和单元格的字体大小一样
145.gif
        inputobj.css("font-size",tdobj.css("font-size"));
146.gif
        //让文本框和单元格的字体保持一致
147.gif
        inputobj.css("font-family",tdobj.css("font-family"));
148.gif
        //让文本框和单元格的背景保持一致
149.gif
        inputobj.css("background-color",tdobj.css("background-color"));
150.gif
        inputobj.css("color","#C75F3E");
151.gif
        
152.gif
        //给文本框赋值
153.gif
        inputobj.val(text);
154.gif
        
155.gif
        //appendTo方法把文本框添加到td中
156.gif
        inputobj.appendTo(tdobj);
157.gif
    });
158.gif
});

       但是以上代码看起来非常的繁琐,jQuery有一个非常好的优点,就是它的代码连缀。上面的代码可以通过连缀进行简化:
       Code5:

159.gif
160.gif
Code
161.gif
162.gif
$(document).ready(function()
163.png
{
164.gif
    //找到学号这一列的所有单元格
165.gif
    //因为学号这一列的单元格在所有td中的位置是偶数(0,2,4,6),所以通过even就可以筛选到td中偶数位的单元格
166.gif
    var numTd = $("tbody  td:even");
167.gif
    
168.gif
    //单击这些td时,创建文本框
169.gif
170.gif
    numTd.click(function()
171.png
{
172.gif
        //创建文本框对象
173.gif
        var inputobj = $("");
174.gif
        //获取当前点击的单元格对象
175.gif
        var tdobj = $(this);
176.gif
        //获取单元格中的文本
177.gif
        var text = tdobj.html();
178.gif
        
179.gif
        //清空单元格的文本
180.gif
        tdobj.html("");
181.gif
        
182.gif
        inputobj.css("border","0")
183.gif
                .css("font-size",tdobj.css("font-size"))
184.gif
                .css("font-family",tdobj.css("font-family"))
185.gif
                .css("background-color",tdobj.css("background-color"))
186.gif
                .css("color","#C75F3E")
187.gif
                .width(tdobj.width())
188.gif
                .val(text)
189.gif
                .appendTo(tdobj);
190.gif
    });
191.gif
});

       现在表格中已经成功的插入了文本框,可以对单元格进行编辑了。
       editTable04.jpg 


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

      
193.jpeg
 

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


194.gif
195.gif
inputobj.click(function()
196.png
{
197.gif
            return false;
198.gif
        });

       但是点击单元格的边框时,还是会出现上述的bug,那我们做如下判断:如果单元格中已经插入了文本框,就跳出click事件。
       Code7:

      
199.gif
200.gif
Code
201.gif
202.gif
$(document).ready(function()
203.png
{
204.gif
    //找到学号这一列的所有单元格
205.gif
    //因为学号这一列的单元格在所有td中的位置是偶数(0,2,4,6),所以通过even就可以筛选到td中偶数位的单元格
206.gif
    var numTd = $("tbody  td:even");
207.gif
    
208.gif
    //单击这些td时,创建文本框
209.gif
210.gif
    numTd.click(function()
211.png
{
212.gif
        //创建文本框对象
213.gif
        var inputobj = $("");
214.gif
        //获取当前点击的单元格对象
215.gif
        var tdobj = $(this);
216.gif
        //获取单元格中的文本
217.gif
        var text = tdobj.html();
218.gif
        
219.gif
        //如果当前单元格中有文本框,就直接跳出方法
220.gif
        //注意:一定要在插入文本框前进行判断
221.gif
222.gif
        if(tdobj.children("input").length>0)
223.png
{
224.gif
            return false;
225.gif
        }
226.gif
        //清空单元格的文本
227.gif
        tdobj.html("");
228.gif
        
229.gif
        inputobj.css("border","0")
230.gif
                .css("font-size",tdobj.css("font-size"))
231.gif
                .css("font-family",tdobj.css("font-family"))
232.gif
                .css("background-color",tdobj.css("background-color"))
233.gif
                .css("color","#C75F3E")
234.gif
                .width(tdobj.width())
235.gif
                .val(text)
236.gif
                .appendTo(tdobj);
237.gif
                
238.gif
        inputobj.get(0).select();
239.gif
        //阻止文本框的点击事件
240.gif
241.gif
        inputobj.click(function()
242.png
{
243.gif
            return false;
244.gif
        });    
245.gif
    });
246.gif
});
      
       上面的bug解决了,但是我发现,点击单元格时,虽然从表面上看文字是变了色,但没有让我觉得它是能被编辑的。那么我就做一点点的改动,插入文本框的同时,选中文本框的文本。
       Code 8:
      


247.gif
inputobj.get(0).select();
 
       但是问题又来了,在Safari浏览器中,要让文本框处于选中状态,必须显得让文本框获得焦点。而我们这里只是在点击单元格时,插入文本框并给文本框赋值,文本框并没有获得焦点。解决的方法:通过jQuerytrigger方法来触发某个事件。
       Code9: 
248.gif
inputobj.trigger("focus").trigger("select"); 
   三、文本框按键事件处理
      
以上的这些问题解决了,那我们就再来给文本框添加一些按键事件。我们知道不同的浏览器中获取按键的keyCode是不同的,但是jQuery帮我们解决了这个问题。
       只需要在事件的function中加入event参数,然后在方法体中,通过event对象的which属性就能获得keyCode,event.which属性同化了不同浏览器获取keyCode的方法。
       获得keyCode之后,我主要做两个按键事件:ESC(键值:27)Enter(键值:13)
       Code10:

       

249.gif
250.gif
Code
251.gif
        //处理文本框上回车和esc按键的操作
252.gif
        //jQuery中某个事件方法的function可以定义一个event参数,jQuery会屏蔽浏览器的差异,传递给我们一个可用的event对象
253.gif
254.gif
        inputobj.keyup(function(event)
255.png
{
256.gif
            //获取当前按键的键值
257.gif
            //jQuery的event对象上有一个which的属性可以获得键盘按键的键值
258.gif
            var keycode = event.which;
259.gif
            //处理回车的情况
260.gif
261.gif
            if(keycode==13)
262.png
{
263.gif
                //获取当前文本框的内容
264.gif
                var inputtext = $(this).val();
265.gif
                //将td的内容修改成文本框中的内容
266.gif
                tdobj.html(inputtext);
267.gif
            }
268.gif
            //处理esc的情况
269.gif
270.gif
            if(keycode == 27)
271.png
{
272.gif
                //将td中的内容还原成text
273.gif
                tdobj.html(text);
274.gif
            }
275.gif
        });
      
       下面是完整的js代码:
       Code11:

      
276.gif
277.gif
Code
278.gif
279.gif
$(document).ready(function()
280.png
{
281.gif
    //找到学号这一列的所有单元格
282.gif
    //因为学号这一列的单元格在所有td中的位置是偶数(0,2,4,6),所以通过even就可以筛选到td中偶数位的单元格
283.gif
    var numTd = $("tbody  td:even");
284.gif
    
285.gif
    //单击这些td时,创建文本框
286.gif
287.gif
    numTd.click(function()
288.png
{
289.gif
        //创建文本框对象
290.gif
        var inputobj = $("");
291.gif
        //获取当前点击的单元格对象
292.gif
        var tdobj = $(this);
293.gif
        //获取单元格中的文本
294.gif
        var text = tdobj.html();
295.gif
        
296.gif
        //如果当前单元格中有文本框,就直接跳出方法
297.gif
        //注意:一定要在插入文本框前进行判断
298.gif
299.gif
        if(tdobj.children("input").length>0)
300.png
{
301.gif
            return false;
302.gif
        }
303.gif
        //清空单元格的文本
304.gif
        tdobj.html("");
305.gif
        
306.gif
        inputobj.css("border","0")
307.gif
                .css("font-size",tdobj.css("font-size"))
308.gif
                .css("font-family",tdobj.css("font-family"))
309.gif
                .css("background-color",tdobj.css("background-color"))
310.gif
                .css("color","#C75F3E")
311.gif
                .width(tdobj.width())
312.gif
                .val(text)
313.gif
                .appendTo(tdobj);
314.gif
                
315.gif
        inputobj.get(0).select();
316.gif
        //阻止文本框的点击事件
317.gif
318.gif
        inputobj.click(function()
319.png
{
320.gif
            return false;
321.gif
        });
322.gif
        
323.gif
        //处理文本框上回车和esc按键的操作
324.gif
        //jQuery中某个事件方法的function可以定义一个event参数,jQuery会屏蔽浏览器的差异,传递给我们一个可用的event对象
325.gif
326.gif
        inputobj.keyup(function(event)
327.png
{
328.gif
            //获取当前按键的键值
329.gif
            //jQuery的event对象上有一个which的属性可以获得键盘按键的键值
330.gif
            var keycode = event.which;
331.gif
            //处理回车的情况
332.gif
333.gif
            if(keycode==13)
334.png
{
335.gif
                //获取当前文本框的内容
336.gif
                var inputtext = $(this).val();
337.gif
                //将td的内容修改成文本框中的内容
338.gif
                tdobj.html(inputtext);
339.gif
            }
340.gif
            //处理esc的情况
341.gif
342.gif
            if(keycode == 27)
343.png
{
344.gif
                //将td中的内容还原成text
345.gif
                tdobj.html(text);
346.gif
            }
347.gif
        });
348.gif
        
349.gif
    });
350.gif
});
      
       下面是源文件下载:/Files/psunny/EditTable.rar
 
出处:http://www.cnblogs.com/psunny/本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
您需要登录后才可以回帖 登录 | 立即注册