天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

JavaScript 動態添加表格行 使用模板、標記

對于復雜的操作情況,比如:添加一行之后,在這一行上還要進行相關的操作會顯得有些吃力;本人比較喜歡表現層使用模板、標記填充數據的做法,于是自己做手做了個小組件,與大家一起分享。

組件運行截圖:



設計思路:
  在Table的thead中加入一行隱藏的行,當要添加一行時,復制一次隱藏的行,再將實例數據填充到這一行中相應的位置,填充完畢之后,再將這一行加到表格中去,整個操作完成。
模板:隱藏的行即相當于模板,當需要時復制一次模板。
標記:將模板行復制出來后,該如何填充數據?
  網上比較多的組件的做法是,傳遞進來兩個數組,一組是元素名稱列表,一組是對應的值列表,然后對復制出來的行進行一個查找,發現其中的元素的名稱在元素名稱列表中的,讓其value=對應的值。這樣做可以滿足一般的需求,因為Table里面一般放置文本框,將值放到其中即完成任務。對于復雜的情況,要求將數據填充到其它的位置,這種方法就力不從心了。
  我的做法是將復制進來的模板行看做一段String,在這段String中查找標記,再將數據填充到相應的標記中去,這樣的話,無論你哪個地方要填充數據,只要放一個標記就可以了,比上面的做法要靈活很多。

代碼實現(關鍵點講解)
  我定義的標志為${屬性},傳遞過去的數據為一個entity,當在String中發現${city},則表示將entity.city的內容替換${city},當entity.city為NULL時,用 替換${city}( 網頁中的空格)。

動態添加行方法
復制代碼 代碼如下:
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,將填充好數據的行添加到表格中去
  tbodyOnlineEdit.appendChild(elm);

難點、易出問題點說明

1, 獲取Tbody,ie與firefox有區別,ie在默認的情況下是為table加上tbody的,而firefox則沒有,所以要進行相應的判斷
復制代碼 代碼如下:
//得到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, 進行填充時,實現了兩種情況,一種用根據元素的name,別一種則是根據標記填充
Code
復制代碼 代碼如下:
// 動態添加表格行
// functionname為“setObjValueByName”為根據元素name,
//要求names為元素名稱,value為相對應的值
//
//functionname為“”為標記填充
//要求names為一個對象,value為null
function addInstanceRow(tableId,names,values,functionName)

3, 進行標志的填充時,使用正則表達式進行標記的查找,找到標記后到entity中取相應的屬性的值,取出屬性的值之后,要用 替換字符串中的空格,不然顯示時會有問題,當屬性值為空時用 替換標記符號,代碼在以下函數中。
Code
復制代碼 代碼如下:
//根據標志設置添加值
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, 對于填充標志的做法,剛開始的思路是,直接將模板行中的tr下的內容當成文本進行標志的替換,但是顯示時沒有內容,于是只能逐個把td中的內容對標志進行替換,發現顯示時是正確的,這個地方使我有點困惑。很明顯前者的做法效率更高,卻莫名其妙地顯不出來,只能退而求其次了。
函數調用說明
Code
復制代碼 代碼如下:
//見上面說明,這是添加行最基本的對外函數
function addInstanceRow(tableId,names,values,functionName)
//添加實體列表添加表格中,有幾個entity則添加幾行
//tableId 要動態添加行的Table的ID值
//entityList 對象數組 Array類型,
function addRowByEntityList(tableId,entityList)
//將一個實體添加到一行
function addRowByEntity(tableId,entity)
//刪除觸發事件控件所在的行
function deleteThisRow(targetControl)
//刪除表格下的所有行
function deleteAllRow(tableId)

在IE6,7,firefox2,3測試沒問題,有問題留言或郵件[email protected],謝謝

打包下載

JavaScript技術JavaScript 動態添加表格行 使用模板、標記,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 久久伊人影院 | 999久久久无码国产精蜜柚 | 国产AV亚洲一区精午夜麻豆 | 国产真实女人一级毛片 | 美女直播喷水 | 青柠在线观看视频在线高清 | 国产日韩欧美综合久久 | 粉嫩无套白浆第一次jk | 欧美疯狂做受xxxxx喷水 | 狼人射综合 | 5g天天影院天天看天天爽 | 久久精品一本到东京热 | 国产精品无码亚洲精品 | 久久精品国产亚洲AV久五月天 | 动漫女主被扒开双腿羞辱 | 亚洲免费三级电影 | 无码人妻精品一区二区蜜桃色欲 | 国产成A人片在线观看 | 国产日韩亚洲精品视频 | 亚洲 小说 欧美 激情 另类 | 中文字幕伊人香蕉在线 | 国产精品久久久久久久人人看 | 52色擼99热99| 国产精品永久AV无码视频 | 久久综合色视频 | 啪啪漫画无遮挡全彩h同人 啪啪激情婷婷久久婷婷色五月 | 强伦姧久久久久久久久久 | gv肉片视频免费观看 | 免费高清在线影片一区 | 嘟嘟嘟影院免费观看视频 | 高清国语自产拍免费 | 黄色a三级三级三级免费看 黄色a三级免费看 | 国产亚洲精品首页在线播放 | 成人高清护士在线播放 | 好紧好湿太硬了我太爽了小说 | 99久久全国免费久久爱 | 国产精品人成在线播放新网站 | 伊人亚洲综合网色 | 啊灬啊灬啊灬快高潮视频 | 午夜精品久久久久久久爽牛战 | 免费观看成人www精品视频在线 |