JavaScript 動態(tài)添加表格行 使用模板、標(biāo)記
組件運行截圖:
設(shè)計思路:
在Table的thead中加入一行隱藏的行,當(dāng)要添加一行時,復(fù)制一次隱藏的行,再將實例數(shù)據(jù)填充到這一行中相應(yīng)的位置,填充完畢之后,再將這一行加到表格中去,整個操作完成。
模板:隱藏的行即相當(dāng)于模板,當(dāng)需要時復(fù)制一次模板。
標(biāo)記:將模板行復(fù)制出來后,該如何填充數(shù)據(jù)?
網(wǎng)上比較多的組件的做法是,傳遞進來兩個數(shù)組,一組是元素名稱列表,一組是對應(yīng)的值列表,然后對復(fù)制出來的行進行一個查找,發(fā)現(xiàn)其中的元素的名稱在元素名稱列表中的,讓其value=對應(yīng)的值。這樣做可以滿足一般的需求,因為Table里面一般放置文本框,將值放到其中即完成任務(wù)。對于復(fù)雜的情況,要求將數(shù)據(jù)填充到其它的位置,這種方法就力不從心了。
我的做法是將復(fù)制進來的模板行看做一段String,在這段String中查找標(biāo)記,再將數(shù)據(jù)填充到相應(yīng)的標(biāo)記中去,這樣的話,無論你哪個地方要填充數(shù)據(jù),只要放一個標(biāo)記就可以了,比上面的做法要靈活很多。
代碼實現(xiàn)(關(guān)鍵點講解)
我定義的標(biāo)志為${屬性},傳遞過去的數(shù)據(jù)為一個entity,當(dāng)在String中發(fā)現(xiàn)${city},則表示將entity.city的內(nèi)容替換${city},當(dāng)entity.city為NULL時,用 替換${city}( 網(wǎng)頁中的空格)。
動態(tài)添加行方法
function addInstanceRow(tableId,names,values,functionName){
var tableObj=getTargetControl(tableId);
var tbodyOnlineEdit=getTableTbody(tableObj);
var theadOnlineEdit=tableObj.getElementsByTagName("THEAD")[0];
var elm=theadOnlineEdit.rows[theadOnlineEdit.rows.length-1].cloneNode(true);
elm.style.display="";
if(typeof(names)!="undefined"){
if(typeof(functionName)=="undefined") functionName="setObjValueByName";
if(typeof(values)!="undefined"&&values!=null){
var entity=ArrayToObj(names,values);
setInputValue(elm,entity,functionName);
}
else
setInputValue(elm,names,functionName);
}
tbodyOnlineEdit.appendChild(elm);
}
if(typeof(names)!="undefined"){
if(typeof(functionName)=="undefined") functionName="setObjValueByName";
if(typeof(values)!="undefined"&&values!=null){
var entity=ArrayToObj(names,values);
setInputValue(elm,entity,functionName);
}
else
setInputValue(elm,names,functionName);
}
4,將填充好數(shù)據(jù)的行添加到表格中去
tbodyOnlineEdit.appendChild(elm);
難點、易出問題點說明
1, 獲取Tbody,ie與firefox有區(qū)別,ie在默認的情況下是為table加上tbody的,而firefox則沒有,所以要進行相應(yīng)的判斷
//得到table中的tbody控件,注意兼容firefox
function getTableTbody(tableObj){
var tbodyOnlineEdit=tableObj.getElementsByTagName("TBODY")[0];
if(typeof(tbodyOnlineEdit)=="undefined"||tbodyOnlineEdit==null){
tbodyOnlineEdit=document.createElement("tbody");
tableObj.appendChild(tbodyOnlineEdit);
}
return tbodyOnlineEdit;
}
2, 進行填充時,實現(xiàn)了兩種情況,一種用根據(jù)元素的name,別一種則是根據(jù)標(biāo)記填充
Code
// 動態(tài)添加表格行
// functionname為“setObjValueByName”為根據(jù)元素name,
//要求names為元素名稱,value為相對應(yīng)的值
//
//functionname為“”為標(biāo)記填充
//要求names為一個對象,value為null
function addInstanceRow(tableId,names,values,functionName)
3, 進行標(biāo)志的填充時,使用正則表達式進行標(biāo)記的查找,找到標(biāo)記后到entity中取相應(yīng)的屬性的值,取出屬性的值之后,要用 替換字符串中的空格,不然顯示時會有問題,當(dāng)屬性值為空時用 替換標(biāo)記符號,代碼在以下函數(shù)中。
Code
//根據(jù)標(biāo)志設(shè)置添加值
function setObjValueByFlag(obj,entity){
var objTemp=obj.parentNode;
var arrMatches=objTemp.innerHTML.match(/\${\w+}/g);
if(typeof(arrMatches)=="undefined"||arrMatches==null||typeof(arrMatches.length)=="undefined"||arrMatches.length==null)
return;
var tempValue="";
var propertyValue="";
for(var i=0;i<arrMatches.length;i++){
tempValue=arrMatches[i].replace(/\${|}/g,"");
propertyValue=getEntityPropertyValue(entity,tempValue);
if(propertyValue!=null){
if(typeof(propertyValue)=="string"){
if(propertyValue!="")
propertyValue=propertyValue.replace(/\s/g," ");
else
propertyValue=" ";
}
objTemp.innerHTML=objTemp.innerHTML.replace(arrMatches[i],propertyValue);
}
else{
objTemp.innerHTML=objTemp.innerHTML.replace(arrMatches[i]," ");
}
}
}
4, 對于填充標(biāo)志的做法,剛開始的思路是,直接將模板行中的tr下的內(nèi)容當(dāng)成文本進行標(biāo)志的替換,但是顯示時沒有內(nèi)容,于是只能逐個把td中的內(nèi)容對標(biāo)志進行替換,發(fā)現(xiàn)顯示時是正確的,這個地方使我有點困惑。很明顯前者的做法效率更高,卻莫名其妙地顯不出來,只能退而求其次了。
函數(shù)調(diào)用說明
Code
//見上面說明,這是添加行最基本的對外函數(shù)
function addInstanceRow(tableId,names,values,functionName)
//添加實體列表添加表格中,有幾個entity則添加幾行
//tableId 要動態(tài)添加行的Table的ID值
//entityList 對象數(shù)組 Array類型,
function addRowByEntityList(tableId,entityList)
//將一個實體添加到一行
function addRowByEntity(tableId,entity)
//刪除觸發(fā)事件控件所在的行
function deleteThisRow(targetControl)
//刪除表格下的所有行
function deleteAllRow(tableId)
在IE6,7,firefox2,3測試沒問題,有問題留言或郵件badwps@163.com,謝謝
打包下載
相關(guān)文章
js實現(xiàn)用于建立新的一行且增加的四個文本框為空的且被禁用
js實現(xiàn)用于建立新的一行且增加的四個文本框為空的且被禁用...2007-04-04Javascript highcharts 餅圖顯示數(shù)量和百分比實例代碼
這篇文章主要介紹了Javascript highcharts 餅圖顯示數(shù)量和百分比實例代碼的相關(guān)資料,這里附有實例代碼,需要的朋友可以參考下2016-12-12TypeScript判斷兩個數(shù)組的內(nèi)容是否相等的實現(xiàn)
本文主要介紹了TypeScript?判斷兩個數(shù)組的內(nèi)容是否相等,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11老生常談javascript中邏輯運算符&&和||的返回值問題
下面小編就為大家?guī)硪黄仙U刯avascript中邏輯運算符&&和||的返回值問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04