JavaScript之获取表格目标数据(TableDom.getTableData())
[声明: 1.博文原创 未经同意转载必究,欢迎相互交流]
[声明: 2.博主未知情况下转载,需显著处注明博文来源]
[声明: 3.谢谢尊重劳动成果,谢谢理解与配合~]
一、背景
在生产过程和生活中,遇到好几回需要使用Table的Dom,比如:
1.增添一行表格方便用户交互式填写表单,
2.删除一行表格,
3.获取某一行指定几列的单元格数据并把该数据装载到另一处地方(如:模态框等)
4.获取表格内的某一行指定某些列的行和最大值,最小值,平均值以及对应的下标和整行数据等(为了查询许多所考研学校的录取分数线及其平均分和对应考生信息等,数据太多,实在不想计算!!!!!)
由此,我迫切地需要一个系统的操作Table Dom的工具;(当然,jQuery强大功能以及能够实现上述诸多需求,但一方面,为了提高个人js这方面的能力,另一方面,我确实想实现除了jquery实现功能之外,还没有实现的我需要的一些(个性化,细致化的)功能),所以TableDom的想法产生了。
二、源码:(当前仅仅实现了Table获取指定某一些行内某一些列的数据,并取得其最大值和最小值,以及对应的行的数据(输出在控制台):对应实现的需求是上述需求的第四点)
好了,直接粘上源码吧!
/**
* @Name TableDom.js
*
* @Content Make developer operate js's table to become easier, which is the aim.
* @Author Johnny Zen
* @E-mail johnnyztsd@gmail.com
* @Date 2017-08-02 15:49
* @Version 0.0.1
*
*/ /**
* @introduce functions
*
* @function TableDom.prototype.OPTION_GETTABLEDATA
* @function getTableData
* @function getTableData.init
* @function getTableData.getTableNode
* @function getTableData.getTrNodes
* @function getTableData.checkArguments
* @function getTableData.checkTdsIndexs
* @function getTableData.getRowMaxMinSumData_Line *****
* @function getTableData.showRowsAllByIndex ***
* @function getTableData.printLineData
* @function getTableData.showOptions
*
*/ var TableDom = function() {}; /**
* @name OPTION_GETTABLEDATA(getTableData Option)
*
* @function 获取tableData的默认配置项
*
* @param [可选]tableId 表格ID
* @param [可选]tableIndex 目标table所处的位置在整个文档里table的第i个(以下标0开始)
* @param tds_indexs 按照数组索引号,升序排序(以0下标为索引起始下标)
* @param tds_isUseful 需要采用的数据项的列号对应的真值,与tds_indexs一一对应
* @param [可选]startIndex 开始操纵的table内的起始行下标
* @param [可选]endIndex 最终操纵的table内的末尾行下标
* @param exe 需要执行的函数体
*
* @notice tableId与tableIndex必填一项
* @notice 在table内可能存在某些tr内不规整表格项时(例如:td合并或者异常不存在):
* 此时,最好手动添加配置项属性startIndex和endIndex
*/
//ECNU default option
TableDom.prototype.OPTION_GETTABLEDATA = { tableId: "table",
tableIndex: 2,
tds_indexs: [5, 6, 7, 8],
tds_isUseful: [true, true, true, true],
startIndex:3,
endIndex:40,
exe: ["getRowMaxMinSumData_Line"] } TableDom.prototype.getTableData = function(option) {
//属性
var tableNode = null;
var trNodes = null;
var trNode_cur = null;
var trIndex_cur = 0;
var tdsNodes_cur = null; var MaxRowSum = -1048576;
var MinRowSum = 1048576;
var MaxRowSumIndex = -1;//最大行和值对应table内的下标号
var MinRowSumIndex = -1;//最小行和值对应table内的下标号 //方法 /** ↓ 非功能(函数)区 ↓ **/
/** ↓ not function area ↓ **/ //init function 初始化函数
var init = function() {
//检验参数
checkArguments();
//初始化重要DOM结点
getTableNode(option.tableId, option.tableIndex);
getTrNodes(tableNode);
//检验单元格列号数组的合法性
checkTdsIndexs(option.tds_indexs);
}; //get table element node :获取table节点
var getTableNode = function(tableId, tableIndex) {
//console.log('test:getTableNode ' + tableId);
//console.log('test:getTableNode ' + tableIndex); if (tableId == undefined && tableIndex == undefined)
throw new Error("参数不齐全!tableId,tableIndex二者必选其一!"); if (tableId)
tableNode = document.getElementById(tableId);
if (( (tableIndex != null) && (typeof(tableIndex) != 'number')) || (tableNode == null)) {
tableNode = document.getElementsByTagName("table")[tableIndex];
} console.log('test:getTableNode ' + tableNode); if (tableNode == null) {
throw new Error("table is not found!");
}
}; //get tr element nodes: 获取tr行节点
var getTrNodes = function(tableNode) { this.tableNode = tableNode;
trNodes = this.tableNode.getElementsByTagName("tr"); }; //check arguments : 检测参数
var checkArguments = function() { if ((typeof(option) != 'object') || ((option instanceof(TableDom.prototype.OPTION_GETTABLEDATA.constructor)) != true)) {
console.log('++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++');
console.log('+ OPTION ERROR INFORMATION +');
console.log('++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++');
console.log(' typeof(option): ' + typeof(option));
console.log(' (option): ' + (option));
console.log(' option instanceof(TableDom.prototype.OPTION_GETTABLEDATA.constructor): ' + (option instanceof(TableDom.prototype.OPTION_GETTABLEDATA.constructor)));
console.log('++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++');
//设置默认值
option = TableDom.prototype.OPTION_GETTABLEDATA;
return false;
} return true;
}; //check tr's indexs's sort:检测trIndexs顺序是否升序
var checkTdsIndexs = function(tds_indexs) { var curIndex = -1;
for (var i = 0; i < tds_indexs.length; i++) {
curIndex = i;
for (var j = i; j < tds_indexs.length; j++) {
if (curIndex >= tds_indexs[j]) {
throw new Error("列数组索引号必须升序,且独一无二!");
return false;
}
}
} return true; }; /** ↓ 功能(函数)区 ↓ **/
/** ↓ function area ↓ **/ /**
*
* 获取并显示行数据/行和最大(小)值
*
* 操作范围:行
*
* @param tds_indexs 单元格所在列的下标数组
* @param isShowEveryRowData 在执行过程中,是否显示每一行(每一个单元格及其行和)的数据(true/false)
* @param tds_isUseful 配置哪些项目需要与不需要计算
* @param [可选]startIndex 左开右闭区间(以下标0开始)
* @param [可选]endIndex 左开右闭区间(以下标0开始)
*
*/
var getRowMaxMinSumData_Line = function(tds_indexs, isShowEveryRowData, tds_isUseful, startIndex, endIndex) {
var sum_curTr = 0; //计算当前行和:初始化 10 exp 20 var startIdx = startIndex ? startIndex : 0;
var endIdx = endIndex ? endIndex : trNodes.length;
//防止超界
if(startIndex < 0)
startIndex = 0;
if(endIndex > trNodes.length)
endIndex = trNodes.length; var value_curTd;//当前单元格的数值 for (var i = startIdx; i < endIdx; i++) { //扫描行
sum_curTr = 0;
trNode_cur = trNodes[i];
trIndex_cur = i;
tdsNodes_cur == null; tdsNodes_cur = trNode_cur.getElementsByTagName("td");
if(tdsNodes_cur == null){
throw new Error("第" + (i + 1) + "列不存在td单元格!");
}
for (var j = tds_indexs[0], indexCount = 0; indexCount < tds_indexs.length; indexCount++, j = tds_indexs[indexCount]) { //扫描列
if (tds_isUseful[indexCount] == true){
value_curTd = parseFloat(tdsNodes_cur[j].innerText.trim());
if(isNaN(value_curTd)){//处理异常情况(如innerText为数值等)
value_curTd = 0;
}
sum_curTr += value_curTd;
}
} if (isShowEveryRowData) {
console.log('test:tdsNodes_cur: ' + tdsNodes_cur);
printLineData("第 " + (i + 1) + " 行:[Sum:" + sum_curTr + "] ", tdsNodes_cur, tds_isUseful); } if (MaxRowSum < sum_curTr) {
MaxRowSum = sum_curTr;
MaxRowSumIndex = i;
} if (MinRowSum > sum_curTr) {
MinRowSum = sum_curTr;
MinRowSumIndex = i;
}
} //控制台输出信息
console.log('getRowMaxMinSumData_Line:MaxRowSum ' + MaxRowSum + ' ' + MaxRowSumIndex);
console.log('getRowMaxMinSumData_Line:MinRowSum ' + MinRowSum + ' ' + MinRowSumIndex);
showRowsAllByIndex("MaxRowSum", MaxRowSumIndex, trNodes[MaxRowSumIndex]);
showRowsAllByIndex("MinRowSum", MinRowSumIndex, trNodes[MinRowSumIndex]); return {
MaxRowSum: MaxRowSum,
MinRowSum: MinRowSum,
MaxRowSum_RowNumber: MaxRowSumIndex + 1,
MinRowSum_RowNumber: MinRowSumIndex + 1
}
}; //指定任意一行显示其所有数据
var showRowsAllByIndex = function(title,index,rowNode){ // console.log('test:showRowsByIndex title:' + title);
// console.log('test:showRowsByIndex rowNode:' + rowNode);
// console.log('test:showRowsByIndex index:' + index); //参数合法性检测
if(arguments.length != 3){
throw new Error("参数长度不合法!");
}
if(typeof(index) != 'number'){
throw new Error("index必须属于number类型!");
}
if(rowNode.nodeType != 1){
throw new Error("rowNode参数不属于Element元素!");
} var string = title + " 第 " + (index + 1) + " 行:";
var tds = null;
tds = rowNode.getElementsByTagName("td");
if(tds == null){
throw new Error("rowNode中不存在td单元格!");
}
for(var i = 0; i < tds.length; i++){
string += tds[i].innerText + " ";
}
console.log('showRowsByIndex: ' + string.split("\n"));//去掉换行符的影响
} var printLineData = function(title, tds, tds_isUseful) {
var string = "" + title + ": ";
//console.log('test:printLineData ' + tds_isUseful);
for (var i = 0; i < tds.length; i++) {
if (tds_isUseful[i] == true) {
string += tds[i].innerText + " ";
}
}
console.log(string);
}; var showOptions = function(option) {
console.log('++++++++++++++++++++++++++++++ showOptions start +++++++++++++++++++++++++++++++++');
for (var item in option) {
console.log(item + ":" + option[item]);
}
console.log('++++++++++++++++++++++++++++++++++++ end +++++++++++++++++++++++++++++++++++++++++');
}; (function() {//作为调度器与执行器 init(); //初始化
showOptions(option);//显示配置项信息
if(option.exe.indexOf("getRowMaxMinSumData_Line") != -1){ var obj = getRowMaxMinSumData_Line(option["tds_indexs"], false, option.tds_isUseful,option.startIndex,option.endIndex);
console.log('test:obj ' + option.tds_isUseful);
console.log('test:obj ' + obj.MaxRowSum);
console.log('test:obj ' + obj.MinRowSum);
console.log('test:obj ' + obj.MaxRowSum_RowNumber);
console.log('test:obj ' + obj.MinRowSum_RowNumber); }
})(); }
三、测试
var std = new TableDom(); //华东师范大学研究生招生数据网址:https://yjszs.ecnu.edu.cn/system/sslqmd_list.asp?yxid=160
var option = {
tableIndex: 2,
tds_indexs: [5, 6, 7, 8],
tds_isUseful: [true, true, true, true],
startIndex: 3,
endIndex: 40,
exe: ["getRowMaxMinSumData_Line"]
} //华南理工大学高考招生数据网址:http://202.38.194.145/Bachelor/Admission/1bl541elndfdu.xhtml
// var option = {//对应理科段
// tableIndex: 0,
// tds_indexs: [2, 3, 4],
// tds_isUseful: [true, true, true],
// exe: ["getRowMaxMinSumData_Line"],
// startIndex:1,
// endIndex:92,
// } std.getTableData(option);
四、效果
[声明: 1.博文原创, 未经同意转载必究,欢迎相互交流]
[声明: 2.博主未知情况下转载,需显著处注明博文来源]
[声明: 3.谢谢尊重劳动成果,谢谢理解与配合~]
JavaScript之获取表格目标数据(TableDom.getTableData())的更多相关文章
- Javascript class获取回调函数数据
/********************************************************************** * Javascript class获取回调函数数据 * ...
- js遍历获取表格内数据方法
1.一般的表格结构如下 <table> <tr> <td>id</td> <td>name</td> </tr> & ...
- Jquery DataTables 获取表格数据及行数据
注意table变量是 1.jQuery DataTables 行号获取 $("#example tbody tr").on("click", function( ...
- Jquery DataTables 获取表格数据
1.获取表格所有数据 function getTableContent(){ var nTrs = table.fnGetNodes();//fnGetNodes获取表格所有行,nTrs[i]表示第i ...
- 在Bootstrap开发框架中使用dataTable直接录入表格行数据
在Winform开发的时候,我们很多时候可以利用表格控件来直接录入数据,不过在Web上较少看到,其实也可以利用dataTable对象处理直接录入表格行数据,这个可以提高数据的录入方便,特别是在一些简单 ...
- 在Bootstrap开发框架中使用dataTable直接录入表格行数据(2)--- 控件数据源绑定
在前面随笔<在Bootstrap开发框架中使用dataTable直接录入表格行数据>中介绍了在Web页面中使用Jquery DataTable插件进行对数据直接录入操作,这种处理能够给用户 ...
- Atitit 项目界面h5化静态html化计划---vue.js 把ajax获取到的数据 绑定到表格控件 v2 r33.docx
Atitit 项目界面h5化静态html化计划---vue.js 把ajax获取到的数据 绑定到表格控件 v2 r33.docx 1. 场景:应用在项目列表查询场景下1 1.1. 预计初步掌握vue ...
- jQuery获取表格隐藏域与ajax请求数据结合显示详情
0.表格样式
- javascript生成表格增删改查 JavaScript动态改变表格单元格内容 动态生成表格 JS获取表格任意单元格 javascript如何动态删除表格某一行
jsp页面表格布局Html代码 <body onload="show()"> <center> <input type="text" ...
随机推荐
- linux shell $ 特殊变量
$0 #Shell本身的文件名 $1-$n #添加到Shell的各参数值.$1是第1参数.$2是第2参数… $* #所有参数列表.如"$*"用「"」括起来的情 ...
- python之设置控制台字体颜色
# 设置控制台输出字体颜色 # 格式:\033[显示方式;前景色;背景色m # 采用终端默认设置:\033[0m # 红色字体 print('\033[1;31m') print('*' * 10) ...
- JavaScript 教程 之基础教程
1.js 错误 var objClass = { foo:1, bar:2 }; function printf() { var aaa:objClass; aaa.foo = 2; console. ...
- BZOJ4196[Noi2015]软件包管理器——树链剖分+线段树
题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个 ...
- BZOJ1926[Sdoi2010]粟粟的书架——二分答案+主席树
题目描述 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Co rmen 的文章.粟粟家中有一个 R行C 列的巨型书架,书架的每一个位 ...
- P3201 [HNOI2009]梦幻布丁
题目描述 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. 输入输出格式 输入格式: 第 ...
- 在Java Web程序中使用监听器可以通过以下两种方法
之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...
- Elasticsearch GC 时间过长的解决方法
前言:GC 时间过长是个常见的问题,下文我将对应的现象和解决方案进行阐述.为什么这么解决,可以参考我的另外一个博客中的内存使用和GC指标这个章节 我们有时会发现elasticsearch集群挂掉,或者 ...
- Linux中如何运行.AppImage文件
今天在GitHub上发现了一个upterm( https://github.com/railsware/upterm )的开源项目,和其他的并不太一样,对于Linux发行版本只提供了AppImage的 ...
- MATLAB:增加噪声,同时多次叠加噪声图和原图以及求平均图像(imnoise,imadd函数)
本次涉及了对原图像增加高斯噪声.多次叠加原图和高斯噪声图以及叠加后的平均图像. close all; %关闭当前所有图形窗口,清空工作空间变量,清除工作空间所有变量 clear all; clc; R ...