table elements_javascript 기술을 사용하여 js를 사용하여 테이블 행과 열을 추가하고 삭제하는 기술 요약
이 기사의 예에서는 js를 사용하여 테이블 요소를 조작하여 테이블 행과 열을 추가하고 삭제하는 방법을 설명합니다. 참고하실 수 있도록 모든 사람과 공유하세요. 자세한 내용은 다음과 같습니다.
/************ TableTool.js ****************************************************************************************************************** ************************************************************** 快速索引 *************************************************************** 表格行、列删除 【一】、 doTableRowDelete 说明:默认根据当前事件指向的对象,向上寻找TR,进行删除(可选参数:表格对象;删除的行的行号,按升序方式以逗号分割,如2,3,5;向上遍历TD几次,默认为1次) 合并表格 ****** 【一】、 conbainTableRow 说明:纵向单元格的内容相同的合并,传入表格对象,需要合并的列,(可选的参数,从第几行开始); 【二】、 combineCell 说明:横向单元格合并,传入单元格内一对象,(可选的参数,合并几个单元格<向右>;是否保留原单元格的值); 单元格与行的移动 ****** 【一】、 moveUp 说明:进行上移,(可选参数,最上移动到第几行,默认为第零行;需要移动的行或者td对象或者td内的子对象,默认获取当前事件指向的行) 【二】、 moveDown 说明:进行下移,(可选参数,最低移动到倒数第几行,默认为倒数第零行;需要移动的行或者td对象或者td内的子对象,默认获取当前事件指向的行) 【三】、 moveCell 说明:行交换,表格对象、交换的行的行号 赋值单元格样式 ****** 【一】、 cloneStyle 说明:将模板单元格的样式COPY到目标单元格上,模板单元格,要修正样式的单元格 新增行、列 ****** 【一】、 insertTableRow 说明:新增行,表格对象,添加行的内容的数组(可选参数,每个单元格的colSpan的数组参数,默认取前一行的属性; 添加到的行的行号,默认是最后一行) 【二】、 insertTableCol 说明:新增列,表格对象,添加行的内容的数组(可选参数,每个单元格的rowSpan的数组参数,默认取前一列的属性;添加到的列的列号,默认是最后一列) 获取表格中一行的元素 ****** 【一】、 doGetRowObj 说明: 获取表格中行内的元素 ,表格对象,行号,(可选参数,是否copy对象,默认为false;是否获取单元格对象,默认false) 其他验证与参数获取 ****** 【一】、 doFetchBaseCols 说明:获取列号在表格内行中的实际位置,表格对象,列号;返回一个数组,记录每行中指定的单元格的cellIndex 【二】、 doFetchEffectCells 说明:获取插入当前行,被影响到rowSpan属性的单元格集合 【三】、 calculateSpanWidth 说明:计算Span的宽度,根据当前span外的单元格的宽度,(可选参数:容器对象,容器对象为空时,取当前document,即遍历页面上所有的Span对象) ******************************************************************************************************************************************* ***********************************************************************************************************************************************/ /** * 删除表格的行 * * tdCount 根据当前event事件向上追溯TD对象几次,默认为1次 * * 说明:event事件需要附着在将要删除的TD内部,且不能有多重TD的嵌套;否则需要指定嵌套几层TD对象 */ function doTableRowDelete(){ var tablObj = arguments[0]; var trIndexs = arguments[1]; var tdCount = arguments[2]==undefined?1:parseFloat(arguments[2]); if(trIndexs==undefined){ tdCount = tdCount-1; var tdObj = event.srcElement; var trObj,tableObj; while(tdCount > 0){ tdCount--; while(tdObj.tagName != 'TD'){ tdObj = tdObj.parentNode; } tdObj = tdObj.parentNode; } while(tdObj.tagName != 'TD'){ tdObj = tdObj.parentNode; } trObj = tdObj.parentNode; tableObj = trObj.parentNode; if(tableObj.tagName != 'TABLE'){ tableObj = tableObj.parentNode; } var cellIndex = tdObj.cellIndex; var rowIndex = trObj.rowIndex; var effectCells = doFetchEffectCells(tableObj,rowIndex); for(var i=0;i<effectCells.length;i++){ effectCells[i].rowSpan = effectCells[i].rowSpan - 1; } tableObj.deleteRow(rowIndex); }else{ var delIndexArr = trIndexs.split(","); for(var i=delIndexArr.length-1;i>-1;i--){ tablObj.deleteRow(delIndexArr[i]); } } isDeleteFlag = true; return isDeleteFlag; } /** * 删除表格的列 * * tdCount 根据当前event事件向上追溯TD对象几次,默认为1次 * * 说明:event事件需要附着在将要删除的TD内部,且不能有多重TD的嵌套;否则需要指定嵌套几层TD对象 */ function doTableColDelete(){ var isDeleteFlag = false; var tdCount = arguments[0]==undefined?1:parseFloat(arguments[0]); var tdObj = event.srcElement; while(tdCount!=0){ tdCount--; while(tdObj.tagName != 'TD'){ tdObj = tdObj.parentNode; } } var trObj = tdObj.parentNode; var tableObj = trObj.parentNode; var cellIndex = tdObj.cellIndex; var rowIndex = trObj.rowIndex; tableObj.deleteRow(rowIndex); isDeleteFlag = true; return isDeleteFlag; } /** * 根据Span外最临近的TD的宽度计算重置当前Span的宽度 * * obj 可以是页面上一个容器对象,TR、TD、TABLE,此项为空,则会遍历页面上所有的Span对象 */ function calculateSpanWidth(){ var obj = arguments[0]; var spanObjs; if(obj!=undefined){ spanObjs = obj.getElementsByTagName('span'); }else{ spanObjs = document.getElementsByTagName('span'); } for(var i=0;i<spanObjs.length;i++){ var tdObj = spanObjs[i].parentNode; while(tdObj.tagName!='TD'&&typeof(tdObj)=='Object'){ tdObj = tdObj.parentNode; } if(tdObj.tagName=='TD'){ var offsetWidth = tdObj.offsetWidth; spanObjs[i].style.width = offsetWidth-5; } } } /** * 合并表格中纵向相邻单元格的内容相同的项 * * tableObj 表格对象(必须) * combainCols 需要合并的列 (格式:从小到大,连续的用-分割,独立的用逗号; 例如:1-5,7,9) * beginRowIndex 从第几行开始合并, 默认从第零行开始 */ function conbainTableRow(){ var tableObj = arguments[0]; var combainCols = arguments[1]; var beginRowIndex = arguments[2]==undefined?0:arguments[2]; //var beginColIndex = arguments[3]==undefined?0:arguments[3]; var colsArr = combainCols.split(","); var cols = new Array(); var index = 0; for(var i=0;i<colsArr.length;i++){ var indexChar = colsArr[i].indexOf("-"); if(indexChar!=-1){ var beginIndex = parseInt(colsArr[i].substring(0,indexChar)); var endIndex = parseInt(colsArr[i].substring(indexChar+1)); for(var j=beginIndex;j<=endIndex;j++){ cols[index++] = j; } } else{ cols[index++] = parseInt(colsArr[i]); } } if(tableObj.rows.length>beginRowIndex){ var modelArr = new Array(); for(var i=beginRowIndex;i<tableObj.rows.length;i++){ var row = tableObj.rows[i]; for(var k=cols.length-1;k>=0;k--){ var j = cols[k]; if(modelArr[j]==undefined){ modelArr[j] = row.cells[j]; }else{ if(row.cells[j].outerText == modelArr[j].outerText){ modelArr[j].rowSpan = modelArr[j].rowSpan + 1; row.deleteCell(j); }else{ modelArr[j] = row.cells[j]; } } } } } } /** * 行上移 * *minRowIndex 向上移动到的最小行号,默认时零 * Elm 可以缺省,如果当前需要移动的行与激发本函数的位置有比较复杂的关系时,需要自行指名tr对象或者当前行的td对象传入 * * 返回,移动成功返回true,如果当前时第minRowIndex行则返回false */ function moveUp(){ //传入的对象 var minRowIndex = arguments[0]==undefined?0:arguments[0]; //传入的对象 var Elm = arguments[1]; //返回值 var isSuccess = false; //表格对象 var myTable; if(Elm==undefined){ Elm=event.srcElement; } while(Elm&&Elm.tagName!="TR"){ Elm=Elm.parentElement; } //当前行号 var x = Elm.rowIndex; //获取表格对象 myTable = Elm.parentElement; if(myTable.tagName!='TABLE'){ myTable = myTable.parentNode; } //移到上一行 if (x > minRowIndex){ moveCell(myTable, x, x-1); isSuccess = true; } return isSuccess; } /** * 行下移 * *minRowIndex 向下移动到表格的倒数几行,默认是零,即表格的最后一行 * Elm 可以缺省,如果当前需要移动的行与激发本函数的位置有比较复杂的关系时,需要自行指名tr对象或者当前行的td对象传入 * * 返回,移动成功返回true,如果当前时最后一行则返回false */ function moveDown(){ //传入的对象 var minRowIndex = arguments[0]==undefined?0:arguments[0]; //传入的对象 var Elm = arguments[1]; //返回值 var isSuccess = false; //表格对象 var myTable; if(Elm==undefined){ Elm=event.srcElement; } while(Elm&&Elm.tagName!="TR"){ Elm=Elm.parentElement; } //当前行号 var x = Elm.rowIndex; //获取表格对象 myTable = Elm.parentElement; if(myTable.tagName!='TABLE'){ myTable = myTable.parentNode; } var tableLength = myTable.rows.length; //移到下一行 if (x < tableLength-minRowIndex-1){ moveCell(myTable, x, x+1); isSuccess = true; } return isSuccess; } /** * 行交换,处理了checkbox丢值的问题 * *myTable 表格对象 * a 行号 * b 行号 */ function moveCell(myTable, a, b){ var e2 = myTable.rows[a].all.tags("input"); var e3 = myTable.rows[b].all.tags("input"); var arr = []; //遍历a行的所有input控件 for(i = 0; i < e2.length; i++) { if(e2[i].type == "checkbox"){ //对所有checkbox控件添加到数组中 arr.push(e2[i], e2[i].checked); } } //遍历b行的所有input控件 for(i = 0; i < e3.length; i++) { if(e3[i].type == "checkbox"){ //对所有checkbox控件添加到数组中 arr.push(e3[i], e3[i].checked); } } myTable.moveRow(a, b); //对数组中所有元素获得对象并对引用的对象赋原值 while(arr.length > 0){ arr.shift().checked = arr.shift(); } } /** *替换单元格的样式为传入的单元格样式 * *tdObj 模板单元格 *targetTdObj 目标替换的单元格 * */ function cloneStyle(){ //单元格中对象 var tdObj = arguments[0]; //合并列数 var targetTdObj = arguments[1]; //克隆传入的对象 var tempObj = tdObj.cloneNode(false); //克隆目标对象 var targetHtml = targetTdObj.innerHTML; //横向合并的个数 var colspan = targetTdObj.colSpan; //纵向合并的个数 var rowspan = targetTdObj.rowSpan; //宽度 var width = targetTdObj.width; //行对象 var rowObj = tdObj.parentNode; //替换当前单元格 rowObj.replaceChild(tempObj, targetTdObj); //for(var i=0;i<targetObj.childNodes.length;i++){ // tempObj.appendChild(targetObj.childNodes[i]); //} tempObj.innerHTML = targetHtml; tempObj.colSpan = colspan; tempObj.rowSpan = rowspan; tempObj.width = width; } /** * 合并单元格,TODO:行合并暂未实现 * * obj 单元格中对象 * colspan 合并列数 * rowspan 合并的行数 *keepFlag 是否保留每个单元格的值 */ function combineCell(){ //单元格中对象 var obj = arguments[0]; //合并列数 var colspan = arguments[1]==undefined?1:arguments[1]; //合并的行数 var rowspan = arguments[2]==undefined?1:arguments[2]; //是否保留每个单元格的值 var keepFlag = arguments[3]==undefined?false:arguments[3]; var elementObjs = new Array(); var tdObj = obj.tagName!='TD'?obj.parentNode:obj; var trObj = tdObj.parentNode; var tableObj = trObj.parentNode; if(tableObj.tagName!='TABLE'){ tableObj = tableObj.parentNode; } //当前单元格的原来的格式 var colIndex = tdObj.cellIndex; var rowIndex = trObj.rowIndex; // //var colIndexs; //if(rowspan>1){ // colIndexs = doFetchBaseCols(tableObj,doGetColIndex(obj)); //} for(var i=colspan-1;i>0;i--){ //alert("i+colIndex="+(i+colIndex)); //alert("trObj.cells.length="+trObj.cells.length); var tempObj = trObj.cells[i+colIndex].cloneNode(true); elementObjs[elementObjs.length] = tempObj; trObj.removeChild(trObj.cells[i+colIndex]); } tdObj.colSpan = tdObj.colSpan + colspan - 1; //alert("keepFlag="+keepFlag); //alert("elementObjs.length="+elementObjs.length); //添加每个单元格的对象 if(keepFlag&&elementObjs.length>0){ for(var i=elementObjs.length-1;i>-1;i--){ var tempObj = elementObjs[i]; for(var j=0;j<tempObj.childNodes.length;j++){ tdObj.appendChild(tempObj.childNodes[j]); } } } } /** * 对表格新增一行 * * tableObj 被新增的表格对象 * htmlArr添加内容对象数组, * htmlCols 每个td的元素对应的colSpan参数,为空则获取之前的Tr信息,否则根据htmlCols生成 * rowIndex 行号 默认方式在最后一行新增行,从零开始 * *返回新增成功、失败 */ function insertTableRow(){ //表格对象 var tableObj = arguments[0]; //增加对象集 var htmlArr = arguments[1]; //元素的TD的colSpan属性 var htmlCols = arguments[2]==undefined?new Array():arguments[2]; //增加的行位置 var rowIndex = arguments[3]; //根据当前table表的行数,进行参数的处理 if(tableObj==undefined||tableObj.rows==undefined){ rowIndex = 0; }else if(rowIndex==undefined||rowIndex>tableObj.rows.length){ rowIndex = tableObj.rows.length; } //新增行成功标志,默认失败 var isSuccess = doCheckPara(tableObj,htmlArr,htmlCols,rowIndex); if(isSuccess){ //新增行 //alert("tableObj="+tableObj.rows.length+"\nrowIndex="+rowIndex); //alert("htmlArr.length="+htmlArr.length); var newTrObj = tableObj.insertRow(rowIndex); for(var i=0;i<htmlArr.length;i++){ var cellObj = newTrObj.insertCell(i); //判断传入参数不为空,添加对象 if(htmlArr[i]!=undefined && htmlArr[i]!=null){ if(htmlArr[i].constructor == Array){ var childHtmlArr = htmlArr[i]; for(var k=0;k<childHtmlArr.length;k++){ if(typeof(childHtmlArr[k])=='object'){ cellObj.appendChild(childHtmlArr[k]); } } }else{ if(typeof(htmlArr[i])=='object'){ cellObj.appendChild(htmlArr[i]); }else{ cellObj.innerHTML = htmlArr[i]; } } } if(htmlCols[i]!=undefined && htmlCols[i]!="" && htmlCols[i]!="1"){ cell.colSpan=htmlCols[i]; } } isSuccess = true; } return isSuccess; } /** * 对表格新增一行 * * tableObj 被新增的表格对象 * htmlArr 添加内容对象数组, * htmlRows 每个td的元素对应的rowSpan参数,为空则获取之前的Td信息,否则根据htmlRows生成 * colIndex 行号 默认方式在最后一列新增列(此处的指定列进行插入,在表格中存在rowSpan!=1的情况下会有有问题),从零开始 * *返回新增成功、失败 */ function insertTableCol(){ //表格对象 var tableObj = arguments[0]; //增加对象集 var htmlArr = arguments[1]; //元素的TD的rowSpan属性 var htmlRows = arguments[2]==undefined?new Array():arguments[2]; //增加的列位置 var colIndex = arguments[3]; //alert(colIndex); var baseHtmlCols = doFetchBaseCols(tableObj,colIndex); //判断返回为undefined,则表示当前不可进行插入操作 if(baseHtmlCols==undefined){ return false; } //新增行成功标志,默认失败 var isSuccess = doCheckPara(tableObj,htmlArr,htmlRows,colIndex,false,baseHtmlCols); if(isSuccess){ //新增行 var rowSpanCount = 0; var rowIndex = 0; //alert("htmlArr.length="+htmlArr.length); for(var i=0,rowIndex=0;rowIndex<tableObj.rows.length&&rowIndex<htmlArr.length;i++){ var trObj = tableObj.rows[rowIndex]; var index = baseHtmlCols[rowIndex]; var cellObj = trObj.insertCell(index); //判断传入参数不为空,添加对象 if(htmlArr[i]!=undefined && htmlArr[i]!=null){ if(htmlArr[i].constructor == Array){ var childHtmlArr = htmlArr[i]; for(var k=0;k<childHtmlArr.length;k++){ if(typeof(childHtmlArr[k])=='object'){ cellObj.appendChild(childHtmlArr[k]); } } }else{ if(typeof(htmlArr[i])=='object'){ cellObj.appendChild(htmlArr[i]); }else{ cellObj.innerHTML = htmlArr[i]; } } } if(htmlRows[i]!=undefined && htmlRows[i]!="" && htmlRows[i]!="1"){ cellObj.rowSpan=htmlRows[i]; } //alert(htmlRows[0]+"\n"+htmlRows[1]+"\n"+htmlRows[2]+"\n"+htmlRows[3]+"\n"); //跳过已经被合并的行 rowIndex = rowIndex + (htmlRows[i]!=undefined?parseFloat(htmlRows[i]):1); //alert(rowIndex); } isSuccess = true; } return isSuccess; } /** *获取表格中一行的元素,对象数组,返回单元格对象数组、单元格的第一个子对象数组 * * tableObj 表格对象 * rowIndex 获取的行号 ,从零开始 * isCopy 获取copy对象,默认为false,不进行copy * isCellObj 获取单元格对象数组标志,,默认为false,返回单元格的子对象 */ function doGetRowObj(){ var objArr = new Array(); //表格对象 var tableObj = arguments[0]; //增加对象集 var rowIndex = arguments[1]; //是否获取COPY对象 var isCopy = arguments[2]==undefined?false:arguments[2]; //是否为单元格对象 var isCellObj = arguments[3]==undefined?false:arguments[3]; //c判断为当前为拷贝时 if(isCopy){ //var copyTable = document.body.createTextRange(); //copyTable.moveToElementText(tableObj); var memeoryTable = tableObj.cloneNode(true); tableObj = memeoryTable; } //判断对象为空或者不是一个表格对象时 if(tableObj==undefined || tableObj.tagName!="TABLE"){ alert("传入表格(tableObj)不是一个对象或表格!"); return objArr; } //判断表格内容为空时 if(tableObj.rows==undefined||tableObj.rows.length==0){ alert("当前表格对象为空!"); return objArr; } //判断要读取的行参数为空 if(rowIndex==undefined){ alert("未指名获取的行号!"); return objArr; } //判断当前要获取的行超过表格对象的范围 if(rowIndex<0 || rowIndex>=tableObj.rows.length){ alert("要获取的行号不在当前的表格对象内!"); return objArr; } //进行行内容提取,返回对象 var rowObj = tableObj.rows[rowIndex]; for(var i=0;i<rowObj.cells.length;i++){ var cellObj = rowObj.cells[i]; var objCopy; //返回当前单元格 if(isCellObj){ objCopy = cellObj; } else{ objCopy = cellObj.childNodes!=undefined?cellObj.childNodes[0]:undefined; } objArr[i] = objCopy; } return objArr; } /** *进行列或者行插入前的check,如果默认的colSpan与rowSpan不存在则根据行去前一行、列取前一列的思路获取默认值 * * tableObj 表格对象 * htmlArr 内容对象数组, * htmlSpan 元素的TD的colSpan、rowSpan属性 * index 行号 增加的行、列位置,从零开始 */ function doCheckPara(){ //表格对象 var tableObj = arguments[0]; //增加对象集 var htmlArr = arguments[1]; //元素的TD的colSpan、rowSpan属性 var htmlSpan = arguments[2]; //增加的行、列位置 var index = arguments[3]; //alert("tableObj="+tableObj+"\nhtmlArr.length="+htmlArr.length+"\nhtmlSpan.length="+htmlSpan.length+"\nindex="+index); //新增列、行标志,默认为行追加 var isRowInsert = arguments[4]==undefined?true:false; var baseHtmlCols = arguments[5]; //新增行成功标志,默认失败 var isSuccess = false; if(tableObj==undefined||tableObj.tagName!="TABLE"){ alert("传入表格(tableObj)不是一个对象或表格!"); return isSuccess; } //传入的为表格 else{ //验证逻辑上的错误 if(htmlArr==undefined){ alert("传入的对象数组(htmlArr)为空或未定义!"); return isSuccess; }else if(htmlSpan.length>0 && htmlSpan.length!=htmlArr.length){ alert("传入的属性(htmlCols)与增加对象集(htmlArr)的长度不等!"); return isSuccess; } //行追加 if(isRowInsert){ var tableRowLength = tableObj.rows!=undefined?tableObj.rows.length:0; //设置初始值 //设置元素对应的colSpan的属性,默认取当前要插入行的前一行的属性 if(htmlSpan.length==0 && index>0 && index<tableRowLength){ //获取临近一行对象 var lastTrObj = tableObj.rows[index-1]; //获取默认TD样式与当前存入元素不对应,无法插入 if(lastTrObj.childNodes.length!=htmlArr.length){ alert("插入失败,获取默认单元格的colSpan属性的个数与传入对象的个数不相等!"); return isSuccess; }else { for(var i=0;i<lastTrObj.childNodes.length;i++){ var cellObj = lastTrObj.childNodes[i]; //列属性 htmlSpan[i] = cellObj.colSpan!=undefined?cellObj.colSpan:"1"; } } } } //列追加时 else{ var tableRowLength = tableObj.rows!=undefined?tableObj.rows.length:0; if(index!=undefined && index>0 && htmlSpan.length==0){ for(var i=0,k=0;i<tableRowLength;i++){ if(baseHtmlCols[i]!=undefined && baseHtmlCols[i]>0){ var lastTrObj = tableObj.rows[i]; //alert("baseHtmlCols[i]="+baseHtmlCols[i]); //alert("lastTrObj.cells.length="+lastTrObj.cells.length); var lastTdRowSpan = lastTrObj.cells[parseInt(baseHtmlCols[i])-1].rowSpan; htmlSpan[k++] = lastTdRowSpan; } } if(htmlSpan.length!=htmlArr.length){ alert("插入失败,获取默认单元格的rowSpan属性的个数与传入对象的个数不相等!"); return isSuccess; } } } } isSuccess = true; return isSuccess; } /** *获取表格在指定列在实际行中位置 * *tableObj 表格对象 (必须项) *index 指定的列,数值(必须项),从零开始 * *return baseHtmlCols行中指定列的实际位置,一般情况下返回一个数组,出错时返回一个undefined对象 */ function doFetchBaseCols(){ var tableObj = arguments[0]; var index = arguments[1]; var noAlert = arguments[2]==undefined?false:arguments[2]; // 需要返回的行实际位置 var baseHtmlCols = new Array(); //alert("tableObj="+tableObj); //获取初始值,指定的列 for(var i=0;i<tableObj.rows.length;i++){ baseHtmlCols[i] = index; } if(index!=0){ //进行值获取 for(var i=0;i<tableObj.rows.length;i++){ var row = tableObj.rows[i]; //默认插入列 if(index==undefined){ baseHtmlCols[i] = row.cells.length; } //生成实际的列值 else{ var colsIndex = 0; //计算当前行的个数 for(var j=0;j<row.cells.length;j++){ if(j==baseHtmlCols[i]){ break; } var cell = row.cells[j]; //合并的行数 var rowSpanIndex = cell.rowSpan!=undefined?cell.rowSpan:0; //合并的列数 var colSpanIndex = cell.colSpan!=undefined?cell.colSpan:1; //将当前行减去该TD的colspan参数的影响 baseHtmlCols[i] = baseHtmlCols[i] - (colSpanIndex-1); //循环行,将当前合并的列影响到的列,均调整相应的个数 for(var k=1;k<rowSpanIndex;k++){ baseHtmlCols[i+k] = baseHtmlCols[i+k] - colSpanIndex; } //判断当前指定的列被跳过,因为当前列已经被合并 if(j+(colSpanIndex-1) > baseHtmlCols[i]){ if(!noAlert){ alert("遍历到第"+i+"行时,因为当前插入的列包含在第"+j+"列合并的单元格内,无法在此处进行操作!"); } return undefined; } //判断当前行遍历到指定的列时 else if(j == baseHtmlCols[i]){ break; } } } } } return baseHtmlCols; } /** * 根据表格的一个td的子项,返回当前对象所在列的每个单元格对应的行的位置 * *obj 传入的表格中某个td的一个子对象 *isComplexTable 是否复杂表格标志,默认下都使用false, 1、简单表格,根据该单元格之前的部分就能计算出当前列在表格中的绝对位置的,就设置成false,或者不定义 2、针对删除的单元格所在的行存在受之前行中单元格的rowspan与colspan影响,而使得得到的colIndex列的绝对位置 * *返回一个长度为表格的行个数,存有该列在每行中的位置 * *缺陷,如果表格比较复杂,页面上显示的一列但是在实际行中不是相等的位置 */ function doGetColIndex(obj){ var obj = arguments[0]; var isComplexTable = arguments[1]==undefined?false:arguments[1]; var tdObj = obj.parentNode; var trObj = tdObj.parentNode; var tableObj = trObj.parentNode; if(tableObj.tagName!='TABLE'){ tableObj = tableObj.parentNode; } //当前行下的第几列 var colIndex = tdObj.cellIndex; //当前行是第几行 var rowIndex = trObj.rowIndex; //定义一个需要返回的值 var arrColsIndex; //alert("colIndex="+colIndex); //alert("rowIndex="+rowIndex); //alert("isComplexTable="+isComplexTable); if(isComplexTable){ for(var i=0;true;i++){ arrColsIndex = doFetchBaseCols(tableObj,i); if(arrColsIndex!=undefined){ if(arrColsIndex[rowIndex]==colIndex){ break; }else if(arrColsIndex[rowIndex]>colIndex){ alert("出错当前方法不支持合并列的操作!"); return undefined; } } } }else{ for(var i=colIndex-1;i>-1;i--){ //alert("colIndex="+colIndex); var ChildObj = trObj.cells[i]; var colspanIndex = ChildObj.colSpan-1; //alert("colspanIndex="+colspanIndex); colIndex = colIndex + colspanIndex; } //alert('begin'); //alert("colIndex="+colIndex); arrColsIndex = doFetchBaseCols(tableObj,colIndex); } return arrColsIndex; } /** *获取删除当前行,影响到单元格rowSpan属性的单元格集,此处只能遍历到该行之前的受影响的单元格;如果当前行存在rowSpan属性存在大于1的,本方法未遍历到 * *tableObj 表格对象 (必须项) *index 指定的行,数值(必须项) * *return effectCells,一般情况下返回一个数组,出错时返回一个undefined对象 */ function doFetchEffectCells(){ var tableObj = arguments[0]; var index = arguments[1]; //插入当前会影响到rowSpan属性的单元格对象集 var effectCells = new Array(); //判断新增的行在表格的中间时 if(index>0&&index<tableObj.rows.length){ for(var i=0,k=0;i<index;i++){ var row = tableObj.rows[i]; for(var j=0;j<row.cells.length;j++){ var cellObj = row.cells[j]; var rowSpanIndex = cellObj.rowSpan!=undefined?cellObj.rowSpan:1; if(i+rowSpanIndex>index){ effectCells[k++] = cellObj; } } } } return effectCells; }
이 기사가 JavaScript 프로그래밍에 종사하는 모든 사람에게 도움이 되기를 바랍니다.

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

컴퓨터의 C 드라이브에 메모리를 많이 차지하는 inetpub 폴더가 있는 것으로 나타났습니다. 이 inetpub 폴더는 무엇인가요? 바로 삭제가 가능한가요? 실제로 inetpub는 IIS 서버의 폴더입니다. IIS의 전체 이름은 인터넷 정보 서비스(Internet Information Services)입니다. 웹 사이트를 구축하고 디버깅하는 데 사용할 수 있으며, 필요하지 않으면 제거할 수 있습니다. 구체적인 방법은 다음과 같습니다. 1. 시작 메뉴를 마우스 오른쪽 버튼으로 클릭하고 "프로그램 및 기능"을 선택합니다. 2. 실행 후 "Windows 기능 켜기/끄기"를 클릭합니다. 3. Windows 기능 목록에서 II를 선택 취소합니다.

Xiaohongshu 메모를 삭제하는 방법 Xiaohongshu 앱에서 메모를 편집할 수 있습니다. 다음으로 편집기는 Xiaohongshu 메모 삭제 방법에 대한 사용자 사진과 텍스트를 가져옵니다. 보세요! Xiaohongshu 사용 튜토리얼 Xiaohongshu 메모 삭제 방법 1. 먼저 Xiaohongshu 앱을 열고 메인 페이지로 들어가서 오른쪽 하단에 있는 [Me]를 선택하여 특별 영역으로 들어갑니다. 2. 그런 다음 내 영역에서 다음과 같이 메모 페이지를 클릭합니다. 3. 노트 페이지에 들어가서 오른쪽 상단에 있는 [점 3개]를 클릭합니다. 4. 마지막으로 기능 표시줄이 하단에 확장되고 [삭제]를 클릭하여 완료합니다.

1. 우선, 누군가를 영구 차단 및 삭제하고 영구 추가하지 않는 것은 허위입니다. 상대방을 차단하고 삭제한 후 추가하려면 상대방의 동의만 있으면 됩니다. 2. 사용자가 누군가를 차단하면 상대방은 해당 사용자에게 메시지를 보낼 수 없고, 사용자의 친구 서클을 볼 수 없으며, 사용자와 통화할 수 없습니다. 3. 차단은 사용자의 WeChat 연락처 목록에서 상대방을 삭제하는 것을 의미하지 않습니다. 4. 상대방을 차단한 후 자신의 위챗 연락처 목록에서 상대방을 삭제한 경우, 삭제 후 복구할 수 있는 방법이 없습니다. 5. 상대방을 다시 친구로 추가하려면 상대방이 동의한 후 다시 친구를 추가해야 합니다.

Xiaohongshu는 인기 있는 소셜 전자상거래 플랫폼으로, 사용자 간의 쌍방향 댓글은 플랫폼에서 없어서는 안될 커뮤니케이션 방법입니다. 때때로 우리의 댓글이 다른 사람에 의해 삭제되어 혼란스러울 수 있습니다. 1. Xiaohongshu에서 다른 사람이 삭제한 댓글을 어떻게 검색할 수 있나요? 댓글이 삭제된 것을 발견하면 먼저 플랫폼에서 관련 게시물이나 제품을 직접 검색하여 해당 댓글을 찾을 수 있는지 확인할 수 있습니다. 삭제 후에도 댓글이 계속 표시된다면 원래 게시물 소유자가 삭제했을 수 있습니다. 이때 원래 게시물 소유자에게 연락하여 댓글 삭제 이유를 문의하고 댓글 복원을 요청할 수 있습니다. 댓글이 완전히 삭제되어 원래 게시물에서 찾을 수 없는 경우, 해당 댓글이 플랫폼에 복원될 가능성은 상대적으로 희박합니다. 다른 방법을 시도해 볼 수 있습니다.

컴퓨터를 매일 사용하는 과정에서found.000 파일이 누락되어 손상되었다는 오류 메시지가 나타날 수 있습니다. 이found.000은 어떤 폴더입니까? 더 이상 쓸모가 없으면 삭제할 수 있나요? 이 파일을 모르는 분들이 너무 많아서found.000 폴더에 대해 자세히 알려드릴게요~ 1.found.000 폴더는 무엇인가요? 불법 종료로 인해 컴퓨터가 일부 또는 완전히 분실된 경우, 찾을 수 있습니다. "found.000"이라는 특수 폴더와 그 안에 포함된 ".chk" 확장자를 가진 파일은 시스템 파티션에 있는 지정된 디렉터리에 있습니다. 이 "fo

인기 있는 소셜 전자상거래 플랫폼인 Xiaohongshu는 일상생활과 쇼핑 경험을 공유하기 위해 많은 사용자를 끌어 모았습니다. 때때로 당사는 개인 이미지를 더 잘 유지하거나 플랫폼 규정을 준수하기 위해 적시에 삭제해야 하는 일부 부적절한 콘텐츠를 실수로 게시할 수 있습니다. 1. Xiaohongshu 릴리스를 삭제하는 방법은 무엇입니까? 1. Xiaohongshu 계정에 로그인하고 개인 홈페이지에 들어갑니다. 2. 개인 홈페이지 하단의 '내 창작물' 옵션을 찾아 클릭하여 입장합니다. 3. "내 창작물" 페이지에서는 노트, 동영상 등 게시된 모든 콘텐츠를 볼 수 있습니다. 4. 삭제가 필요한 콘텐츠를 찾아 오른쪽에 있는 "..." 버튼을 클릭하세요. 5. 팝업 메뉴에서 "삭제" 옵션을 선택하세요. 6. 삭제 확인 후 해당 콘텐츠는 개인 홈페이지 및 공개 페이지에서 사라집니다.

얼굴 검출 및 인식 기술은 이미 상대적으로 성숙하고 널리 사용되는 기술입니다. 현재 가장 널리 사용되는 인터넷 응용 언어는 JS입니다. 웹 프런트엔드에서 얼굴 감지 및 인식을 구현하는 것은 백엔드 얼굴 인식에 비해 장점과 단점이 있습니다. 장점에는 네트워크 상호 작용 및 실시간 인식이 줄어 사용자 대기 시간이 크게 단축되고 사용자 경험이 향상된다는 단점이 있습니다. 모델 크기에 따라 제한되고 정확도도 제한됩니다. js를 사용하여 웹에서 얼굴 인식을 구현하는 방법은 무엇입니까? 웹에서 얼굴 인식을 구현하려면 JavaScript, HTML, CSS, WebRTC 등 관련 프로그래밍 언어 및 기술에 익숙해야 합니다. 동시에 관련 컴퓨터 비전 및 인공지능 기술도 마스터해야 합니다. 웹 측면의 디자인으로 인해 주목할 가치가 있습니다.

1. Douyin 앱을 열고 인터페이스 하단의 [메시지]를 클릭한 후 삭제해야 하는 채팅 대화 항목을 클릭합니다. 2. 채팅 기록 중 하나를 길게 누른 후 [복수 선택]을 클릭하고 삭제하려는 채팅 기록을 선택하세요. 3. 해당 기록을 영구 삭제하려면 오른쪽 하단의 [삭제] 버튼을 클릭한 후 팝업창에서 [삭제 확인]을 선택하세요.
