中文字幕日韩一区二区_国产一区二区av_国产毛片av_久久久久国产一区_色婷婷电影_国产一区二区精品

jQuery一步一步實(shí)現(xiàn)跨瀏覽器的可編輯表格,支持IE、Firefox、Safari、Chrome、Opera

要實(shí)現(xiàn)可編輯的表格功能,我們要解決以下問(wèn)題:
1.明確要修改的數(shù)據(jù)在表格中是哪些列(如何找到這些單元格);
2.如何讓單元格變成可以編輯的;
3.如何處理單元格的一些按鍵事件;
4.解決跨瀏覽器問(wèn)題。
我們通過(guò)jQuery可以一步一步解決上述問(wèn)題。
一、 繪制表格
首先我們先畫(huà)好一個(gè)表格。
Code1:
復(fù)制代碼 代碼如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>jQuery的跨瀏覽器可編輯表格</title>
<link rel="stylesheet" type="text/css" href="css/editTable.css" media="all"/>
<script type="text/Javascript" src="js/jquery-1.3.2.min.js"></script>
<script type="text/Javascript" src="js/editTable.js"></script>
</head>
<body>
<table>
<thead>
<tr>
<th colspan="2">鼠標(biāo)點(diǎn)擊表格就可以編輯</th>
</tr>
</thead>
<tbody>
<tr>
<th>學(xué)號(hào)</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>

畫(huà)好表格以后顯示的如圖:
editTable01.jpg
 
很明顯它看起來(lái)不像一個(gè)表格,既沒(méi)有邊框,而且很丑。那么我們先給這個(gè)表格設(shè)置一些樣式。
Code2:
復(fù)制代碼 代碼如下:
body{}{
font-size: 14px;
}
table{}{
color: #4F6B72;
border: 1px solid #C1DAD7;
border-collapse: collapse;
width: 400px;
}
th{}{
width: 50%;
border: 1px solid #C1DAD7;
}
td{}{
width: 50%;
border: 1px solid #C1DAD7;
}

現(xiàn)在效果好多了:
editTable02.jpg
     
但是單元格和單元格之間還是有重疊的邊框,只需要在標(biāo)簽選擇符table中加上這樣一個(gè)屬性就能去除重復(fù)邊框:
border-collapse: collapse;
復(fù)制代碼 代碼如下:
table{}{
color: #4F6B72;
border: 1px solid #C1DAD7;
border-collapse: collapse;
width: 400px;
}

editTable03.jpg

二、 讓表格的單元格變成可編輯的列
繪制好表格以后,我們選取表格中的編號(hào)列作為可編輯的列。要讓這一列的單元格能夠被編輯,就需要在這些列中插入文本框,我們通過(guò)這一列單元格的onclick事件來(lái)插入文本框。
Code3:
復(fù)制代碼 代碼如下:
$(document).ready(function(){
//找到學(xué)號(hào)這一列的所有單元格
//因?yàn)閷W(xué)號(hào)這一列的單元格在所有td中的位置是偶數(shù)(0,2,4,6),所以通過(guò)even就可以篩選到td中偶數(shù)位的單元格
var numTd = $("tbody td:even");
//單擊這些td時(shí),創(chuàng)建文本框
numTd.click(function(){
//創(chuàng)建文本框?qū)ο?
var inputobj = $("<input type='text'>");
//獲取當(dāng)前點(diǎn)擊的單元格對(duì)象
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);
});
});

現(xiàn)在已經(jīng)把文本框插入到單元格中了。既然要編輯文本框,文本框就應(yīng)該有值,文本框的值來(lái)源于單元格中的數(shù)據(jù),并且我們要清空單元格中原有的數(shù)據(jù)。
Code4:
復(fù)制代碼 代碼如下:
$(document).ready(function(){
//找到學(xué)號(hào)這一列的所有單元格
//因?yàn)閷W(xué)號(hào)這一列的單元格在所有td中的位置是偶數(shù)(0,2,4,6),所以通過(guò)even就可以篩選到td中偶數(shù)位的單元格
var numTd = $("tbody td:even");
//單擊這些td時(shí),創(chuàng)建文本框
numTd.click(function(){
//創(chuàng)建文本框?qū)ο?
var inputobj = $("<input type='text'>");
//獲取當(dāng)前點(diǎn)擊的單元格對(duì)象
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);
});
});

但是以上代碼看起來(lái)非常的繁瑣,jQuery有一個(gè)非常好的優(yōu)點(diǎn),就是它的代碼連綴。上面的代碼可以通過(guò)連綴進(jìn)行簡(jiǎn)化:
Code5:
復(fù)制代碼 代碼如下:
$(document).ready(function(){
//找到學(xué)號(hào)這一列的所有單元格
//因?yàn)閷W(xué)號(hào)這一列的單元格在所有td中的位置是偶數(shù)(0,2,4,6),所以通過(guò)even就可以篩選到td中偶數(shù)位的單元格
var numTd = $("tbody td:even");
//單擊這些td時(shí),創(chuàng)建文本框
numTd.click(function(){
//創(chuàng)建文本框?qū)ο?
var inputobj = $("<input type='text'>");
//獲取當(dāng)前點(diǎn)擊的單元格對(duì)象
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);
});
});

現(xiàn)在表格中已經(jīng)成功的插入了文本框,可以對(duì)單元格進(jìn)行編輯了。
editTable04.jpg
      
    但是有個(gè)明顯的bug,當(dāng)你再次點(diǎn)擊同一個(gè)單元格時(shí),會(huì)出現(xiàn)如下效果:

        editTable05.jpg

      
 
是什么原因造成上面這個(gè)bug呢?因?yàn)樵谖谋究蛑胁迦雴卧裰螅谋究蚴菍儆趩卧竦模覀凕c(diǎn)擊文本框時(shí),同樣會(huì)觸發(fā)單元格的click事件。
我們需要阻止文本框的點(diǎn)擊行為(阻止事件冒泡)。
Code6:
復(fù)制代碼 代碼如下:
inputobj.click(function(){
return false;
});

但是點(diǎn)擊單元格的邊框時(shí),還是會(huì)出現(xiàn)上述的bug,那我們做如下判斷:如果單元格中已經(jīng)插入了文本框,就跳出click事件。
Code7:
復(fù)制代碼 代碼如下:
$(document).ready(function(){
//找到學(xué)號(hào)這一列的所有單元格
//因?yàn)閷W(xué)號(hào)這一列的單元格在所有td中的位置是偶數(shù)(0,2,4,6),所以通過(guò)even就可以篩選到td中偶數(shù)位的單元格
var numTd = $("tbody td:even");
//單擊這些td時(shí),創(chuàng)建文本框
numTd.click(function(){
//創(chuàng)建文本框?qū)ο?
var inputobj = $("<input type='text'>");
//獲取當(dāng)前點(diǎn)擊的單元格對(duì)象
var tdobj = $(this);
//獲取單元格中的文本
var text = tdobj.html();
//如果當(dāng)前單元格中有文本框,就直接跳出方法
//注意:一定要在插入文本框前進(jìn)行判斷
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();
//阻止文本框的點(diǎn)擊事件
inputobj.click(function(){
return false;
});
});
});

上面的bug解決了,但是我發(fā)現(xiàn),點(diǎn)擊單元格時(shí),雖然從表面上看文字是變了色,但沒(méi)有讓我覺(jué)得它是能被編輯的。那么我就做一點(diǎn)點(diǎn)的改動(dòng),插入文本框的同時(shí),選中文本框的文本。
Code 8:
復(fù)制代碼 代碼如下:
inputobj.get(0).select();

但是問(wèn)題又來(lái)了,在Safari瀏覽器中,要讓文本框處于選中狀態(tài),必須顯得讓文本框獲得焦點(diǎn)。而我們這里只是在點(diǎn)擊單元格時(shí),插入文本框并給文本框賦值,文本框并沒(méi)有獲得焦點(diǎn)。解決的方法:通過(guò)jQuery的trigger方法來(lái)觸發(fā)某個(gè)事件。
Code9:
復(fù)制代碼 代碼如下:
inputobj.trigger("focus").trigger("select");

三、文本框按鍵事件處理
以上的這些問(wèn)題解決了,那我們就再來(lái)給文本框添加一些按鍵事件。我們知道不同的瀏覽器中獲取按鍵的keyCode是不同的,但是jQuery幫我們解決了這個(gè)問(wèn)題。
只需要在事件的function中加入event參數(shù),然后在方法體中,通過(guò)event對(duì)象的which屬性就能獲得keyCode,event.which屬性同化了不同瀏覽器獲取keyCode的方法。
獲得keyCode之后,我主要做兩個(gè)按鍵事件:ESC鍵(鍵值:27)和Enter鍵(鍵值:13)。
Code10:
復(fù)制代碼 代碼如下:
//處理文本框上回車(chē)和esc按鍵的操作
//jQuery中某個(gè)事件方法的function可以定義一個(gè)event參數(shù),jQuery會(huì)屏蔽瀏覽器的差異,傳遞給我們一個(gè)可用的event對(duì)象
inputobj.keyup(function(event){
//獲取當(dāng)前按鍵的鍵值
//jQuery的event對(duì)象上有一個(gè)which的屬性可以獲得鍵盤(pán)按鍵的鍵值
var keycode = event.which;
//處理回車(chē)的情況
if(keycode==13){
//獲取當(dāng)前文本框的內(nèi)容
var inputtext = $(this).val();
//將td的內(nèi)容修改成文本框中的內(nèi)容
tdobj.html(inputtext);
}
//處理esc的情況
if(keycode == 27){
//將td中的內(nèi)容還原成text
tdobj.html(text);
}
});

下面是完整的js代碼:
Code11:
復(fù)制代碼 代碼如下:
$(document).ready(function(){
//找到學(xué)號(hào)這一列的所有單元格
//因?yàn)閷W(xué)號(hào)這一列的單元格在所有td中的位置是偶數(shù)(0,2,4,6),所以通過(guò)even就可以篩選到td中偶數(shù)位的單元格
var numTd = $("tbody td:even");
//單擊這些td時(shí),創(chuàng)建文本框
numTd.click(function(){
//創(chuàng)建文本框?qū)ο?
var inputobj = $("<input type='text'>");
//獲取當(dāng)前點(diǎn)擊的單元格對(duì)象
var tdobj = $(this);
//獲取單元格中的文本
var text = tdobj.html();
//如果當(dāng)前單元格中有文本框,就直接跳出方法
//注意:一定要在插入文本框前進(jìn)行判斷
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();
//阻止文本框的點(diǎn)擊事件
inputobj.click(function(){
return false;
});
//處理文本框上回車(chē)和esc按鍵的操作
//jQuery中某個(gè)事件方法的function可以定義一個(gè)event參數(shù),jQuery會(huì)屏蔽瀏覽器的差異,傳遞給我們一個(gè)可用的event對(duì)象
inputobj.keyup(function(event){
//獲取當(dāng)前按鍵的鍵值
//jQuery的event對(duì)象上有一個(gè)which的屬性可以獲得鍵盤(pán)按鍵的鍵值
var keycode = event.which;
//處理回車(chē)的情況
if(keycode==13){
//獲取當(dāng)前文本框的內(nèi)容
var inputtext = $(this).val();
//將td的內(nèi)容修改成文本框中的內(nèi)容
tdobj.html(inputtext);
}
//處理esc的情況
if(keycode == 27){
//將td中的內(nèi)容還原成text
tdobj.html(text);
}
});
});
});

相關(guān)文檔打包下載

JavaScript技術(shù)jQuery一步一步實(shí)現(xiàn)跨瀏覽器的可編輯表格,支持IE、Firefox、Safari、Chrome、Opera,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 青青久久av北条麻妃海外网 | 欧美在线一区二区视频 | 一区精品视频 | 91精品综合久久久久久五月天 | 精品日韩欧美一区二区 | eeuss国产一区二区三区四区 | 老司机深夜福利网站 | 亚洲免费大片 | 久久国产精品一区二区三区 | 97精品视频在线观看 | 激情网站在线观看 | 五月婷亚洲 | 麻豆av片| 国产精品国色综合久久 | 欧美三区 | 日韩在线看片 | 国产精品成人久久久久 | 久久久久久久夜 | 久久视频免费看 | 99久久精品免费看国产四区 | 18av在线播放 | 日韩精品一区二区三区免费视频 | 亚洲情侣视频 | 拍戏被cao翻了h承欢 | 亚洲二区精品 | 欧美最猛性xxxxx亚洲精品 | 韩日一区二区三区 | 国产精品中文字幕在线 | 日韩精品在线观看一区二区三区 | 日韩成人影院 | av香蕉| 岛国av免费观看 | 久久久精品网站 | 亚洲人人 | 欧美一级片在线观看 | 久久精品色欧美aⅴ一区二区 | 91精品国产综合久久久动漫日韩 | 国产精品一区二区三区四区 | 91短视频网址 | 久久久久国产一区二区三区四区 | 成人影院免费视频 |