[声明:  1.博文原创 未经同意转载必究,欢迎相互交流]

[声明:  2.博主未知情况下转载,需显著处注明博文来源]

[声明:  3.谢谢尊重劳动成果,谢谢理解与配合~]

一、背景

  在生产过程和生活中,遇到好几回需要使用Table的Dom,比如:

  1.增添一行表格方便用户交互式填写表单,

  2.删除一行表格,

  3.获取某一行指定几列的单元格数据并把该数据装载到另一处地方(如:模态框等)

  4.获取表格内的某一行指定某些列的行和最大值,最小值,平均值以及对应的下标和整行数据等(为了查询许多所考研学校的录取分数线及其平均分和对应考生信息等,数据太多,实在不想计算!!!!!)

  由此,我迫切地需要一个系统的操作Table Dom的工具;(当然,jQuery强大功能以及能够实现上述诸多需求,但一方面,为了提高个人js这方面的能力,另一方面,我确实想实现除了jquery实现功能之外,还没有实现的我需要的一些(个性化,细致化的)功能),所以TableDom的想法产生了。

二、源码:(当前仅仅实现了Table获取指定某一些行内某一些列的数据,并取得其最大值和最小值,以及对应的行的数据(输出在控制台):对应实现的需求是上述需求的第四点)

  好了,直接粘上源码吧!

  

  1. /**
  2. * @Name TableDom.js
  3. *
  4. * @Content Make developer operate js's table to become easier, which is the aim.
  5. * @Author Johnny Zen
  6. * @E-mail johnnyztsd@gmail.com
  7. * @Date 2017-08-02 15:49
  8. * @Version 0.0.1
  9. *
  10. */
  11.  
  12. /**
  13. * @introduce functions
  14. *
  15. * @function TableDom.prototype.OPTION_GETTABLEDATA
  16. * @function getTableData
  17. * @function getTableData.init
  18. * @function getTableData.getTableNode
  19. * @function getTableData.getTrNodes
  20. * @function getTableData.checkArguments
  21. * @function getTableData.checkTdsIndexs
  22. * @function getTableData.getRowMaxMinSumData_Line *****
  23. * @function getTableData.showRowsAllByIndex ***
  24. * @function getTableData.printLineData
  25. * @function getTableData.showOptions
  26. *
  27. */
  28.  
  29. var TableDom = function() {};
  30.  
  31. /**
  32. * @name OPTION_GETTABLEDATA(getTableData Option)
  33. *
  34. * @function 获取tableData的默认配置项
  35. *
  36. * @param [可选]tableId 表格ID
  37. * @param [可选]tableIndex 目标table所处的位置在整个文档里table的第i个(以下标0开始)
  38. * @param tds_indexs 按照数组索引号,升序排序(以0下标为索引起始下标)
  39. * @param tds_isUseful 需要采用的数据项的列号对应的真值,与tds_indexs一一对应
  40. * @param [可选]startIndex 开始操纵的table内的起始行下标
  41. * @param [可选]endIndex 最终操纵的table内的末尾行下标
  42. * @param exe 需要执行的函数体
  43. *
  44. * @notice tableId与tableIndex必填一项
  45. * @notice 在table内可能存在某些tr内不规整表格项时(例如:td合并或者异常不存在):
  46. * 此时,最好手动添加配置项属性startIndex和endIndex
  47. */
  48. //ECNU default option
  49. TableDom.prototype.OPTION_GETTABLEDATA = {
  50.  
  51. tableId: "table",
  52. tableIndex: 2,
  53. tds_indexs: [5, 6, 7, 8],
  54. tds_isUseful: [true, true, true, true],
  55. startIndex:3,
  56. endIndex:40,
  57. exe: ["getRowMaxMinSumData_Line"]
  58.  
  59. }
  60.  
  61. TableDom.prototype.getTableData = function(option) {
  62. //属性
  63. var tableNode = null;
  64. var trNodes = null;
  65. var trNode_cur = null;
  66. var trIndex_cur = 0;
  67. var tdsNodes_cur = null;
  68.  
  69. var MaxRowSum = -1048576;
  70. var MinRowSum = 1048576;
  71. var MaxRowSumIndex = -1;//最大行和值对应table内的下标号
  72. var MinRowSumIndex = -1;//最小行和值对应table内的下标号
  73.  
  74. //方法
  75.  
  76. /** ↓ 非功能(函数)区 ↓ **/
  77. /** ↓ not function area ↓ **/
  78.  
  79. //init function 初始化函数
  80. var init = function() {
  81. //检验参数
  82. checkArguments();
  83. //初始化重要DOM结点
  84. getTableNode(option.tableId, option.tableIndex);
  85. getTrNodes(tableNode);
  86. //检验单元格列号数组的合法性
  87. checkTdsIndexs(option.tds_indexs);
  88. };
  89.  
  90. //get table element node :获取table节点
  91. var getTableNode = function(tableId, tableIndex) {
  92. //console.log('test:getTableNode ' + tableId);
  93. //console.log('test:getTableNode ' + tableIndex);
  94.  
  95. if (tableId == undefined && tableIndex == undefined)
  96. throw new Error("参数不齐全!tableId,tableIndex二者必选其一!");
  97.  
  98. if (tableId)
  99. tableNode = document.getElementById(tableId);
  100. if (( (tableIndex != null) && (typeof(tableIndex) != 'number')) || (tableNode == null)) {
  101. tableNode = document.getElementsByTagName("table")[tableIndex];
  102. }
  103.  
  104. console.log('test:getTableNode ' + tableNode);
  105.  
  106. if (tableNode == null) {
  107. throw new Error("table is not found!");
  108. }
  109. };
  110.  
  111. //get tr element nodes: 获取tr行节点
  112. var getTrNodes = function(tableNode) {
  113.  
  114. this.tableNode = tableNode;
  115. trNodes = this.tableNode.getElementsByTagName("tr");
  116.  
  117. };
  118.  
  119. //check arguments : 检测参数
  120. var checkArguments = function() {
  121.  
  122. if ((typeof(option) != 'object') || ((option instanceof(TableDom.prototype.OPTION_GETTABLEDATA.constructor)) != true)) {
  123. console.log('++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++');
  124. console.log('+ OPTION ERROR INFORMATION +');
  125. console.log('++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++');
  126. console.log(' typeof(option): ' + typeof(option));
  127. console.log(' (option): ' + (option));
  128. console.log(' option instanceof(TableDom.prototype.OPTION_GETTABLEDATA.constructor): ' + (option instanceof(TableDom.prototype.OPTION_GETTABLEDATA.constructor)));
  129. console.log('++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++');
  130. //设置默认值
  131. option = TableDom.prototype.OPTION_GETTABLEDATA;
  132. return false;
  133. }
  134.  
  135. return true;
  136. };
  137.  
  138. //check tr's indexs's sort:检测trIndexs顺序是否升序
  139. var checkTdsIndexs = function(tds_indexs) {
  140.  
  141. var curIndex = -1;
  142. for (var i = 0; i < tds_indexs.length; i++) {
  143. curIndex = i;
  144. for (var j = i; j < tds_indexs.length; j++) {
  145. if (curIndex >= tds_indexs[j]) {
  146. throw new Error("列数组索引号必须升序,且独一无二!");
  147. return false;
  148. }
  149. }
  150. }
  151.  
  152. return true;
  153.  
  154. };
  155.  
  156. /** ↓ 功能(函数)区 ↓ **/
  157. /** ↓ function area ↓ **/
  158.  
  159. /**
  160. *
  161. * 获取并显示行数据/行和最大(小)值
  162. *
  163. * 操作范围:行
  164. *
  165. * @param tds_indexs 单元格所在列的下标数组
  166. * @param isShowEveryRowData 在执行过程中,是否显示每一行(每一个单元格及其行和)的数据(true/false)
  167. * @param tds_isUseful 配置哪些项目需要与不需要计算
  168. * @param [可选]startIndex 左开右闭区间(以下标0开始)
  169. * @param [可选]endIndex 左开右闭区间(以下标0开始)
  170. *
  171. */
  172. var getRowMaxMinSumData_Line = function(tds_indexs, isShowEveryRowData, tds_isUseful, startIndex, endIndex) {
  173. var sum_curTr = 0; //计算当前行和:初始化 10 exp 20
  174.  
  175. var startIdx = startIndex ? startIndex : 0;
  176. var endIdx = endIndex ? endIndex : trNodes.length;
  177. //防止超界
  178. if(startIndex < 0)
  179. startIndex = 0;
  180. if(endIndex > trNodes.length)
  181. endIndex = trNodes.length;
  182.  
  183. var value_curTd;//当前单元格的数值
  184.  
  185. for (var i = startIdx; i < endIdx; i++) { //扫描行
  186. sum_curTr = 0;
  187. trNode_cur = trNodes[i];
  188. trIndex_cur = i;
  189. tdsNodes_cur == null;
  190.  
  191. tdsNodes_cur = trNode_cur.getElementsByTagName("td");
  192. if(tdsNodes_cur == null){
  193. throw new Error("第" + (i + 1) + "列不存在td单元格!");
  194. }
  195. for (var j = tds_indexs[0], indexCount = 0; indexCount < tds_indexs.length; indexCount++, j = tds_indexs[indexCount]) { //扫描列
  196. if (tds_isUseful[indexCount] == true){
  197. value_curTd = parseFloat(tdsNodes_cur[j].innerText.trim());
  198. if(isNaN(value_curTd)){//处理异常情况(如innerText为数值等)
  199. value_curTd = 0;
  200. }
  201. sum_curTr += value_curTd;
  202. }
  203. }
  204.  
  205. if (isShowEveryRowData) {
  206. console.log('test:tdsNodes_cur: ' + tdsNodes_cur);
  207. printLineData("第 " + (i + 1) + " 行:[Sum:" + sum_curTr + "] ", tdsNodes_cur, tds_isUseful);
  208.  
  209. }
  210.  
  211. if (MaxRowSum < sum_curTr) {
  212. MaxRowSum = sum_curTr;
  213. MaxRowSumIndex = i;
  214. }
  215.  
  216. if (MinRowSum > sum_curTr) {
  217. MinRowSum = sum_curTr;
  218. MinRowSumIndex = i;
  219. }
  220. }
  221.  
  222. //控制台输出信息
  223. console.log('getRowMaxMinSumData_Line:MaxRowSum ' + MaxRowSum + ' ' + MaxRowSumIndex);
  224. console.log('getRowMaxMinSumData_Line:MinRowSum ' + MinRowSum + ' ' + MinRowSumIndex);
  225. showRowsAllByIndex("MaxRowSum", MaxRowSumIndex, trNodes[MaxRowSumIndex]);
  226. showRowsAllByIndex("MinRowSum", MinRowSumIndex, trNodes[MinRowSumIndex]);
  227.  
  228. return {
  229. MaxRowSum: MaxRowSum,
  230. MinRowSum: MinRowSum,
  231. MaxRowSum_RowNumber: MaxRowSumIndex + 1,
  232. MinRowSum_RowNumber: MinRowSumIndex + 1
  233. }
  234. };
  235.  
  236. //指定任意一行显示其所有数据
  237. var showRowsAllByIndex = function(title,index,rowNode){
  238.  
  239. // console.log('test:showRowsByIndex title:' + title);
  240. // console.log('test:showRowsByIndex rowNode:' + rowNode);
  241. // console.log('test:showRowsByIndex index:' + index);
  242.  
  243. //参数合法性检测
  244. if(arguments.length != 3){
  245. throw new Error("参数长度不合法!");
  246. }
  247. if(typeof(index) != 'number'){
  248. throw new Error("index必须属于number类型!");
  249. }
  250. if(rowNode.nodeType != 1){
  251. throw new Error("rowNode参数不属于Element元素!");
  252. }
  253.  
  254. var string = title + " 第 " + (index + 1) + " 行:";
  255. var tds = null;
  256. tds = rowNode.getElementsByTagName("td");
  257. if(tds == null){
  258. throw new Error("rowNode中不存在td单元格!");
  259. }
  260. for(var i = 0; i < tds.length; i++){
  261. string += tds[i].innerText + " ";
  262. }
  263. console.log('showRowsByIndex: ' + string.split("\n"));//去掉换行符的影响
  264. }
  265.  
  266. var printLineData = function(title, tds, tds_isUseful) {
  267. var string = "" + title + ": ";
  268. //console.log('test:printLineData ' + tds_isUseful);
  269. for (var i = 0; i < tds.length; i++) {
  270. if (tds_isUseful[i] == true) {
  271. string += tds[i].innerText + " ";
  272. }
  273. }
  274. console.log(string);
  275. };
  276.  
  277. var showOptions = function(option) {
  278. console.log('++++++++++++++++++++++++++++++ showOptions start +++++++++++++++++++++++++++++++++');
  279. for (var item in option) {
  280. console.log(item + ":" + option[item]);
  281. }
  282. console.log('++++++++++++++++++++++++++++++++++++ end +++++++++++++++++++++++++++++++++++++++++');
  283. };
  284.  
  285. (function() {//作为调度器与执行器
  286.  
  287. init(); //初始化
  288. showOptions(option);//显示配置项信息
  289. if(option.exe.indexOf("getRowMaxMinSumData_Line") != -1){
  290.  
  291. var obj = getRowMaxMinSumData_Line(option["tds_indexs"], false, option.tds_isUseful,option.startIndex,option.endIndex);
  292. console.log('test:obj ' +  option.tds_isUseful);
  293. console.log('test:obj ' +  obj.MaxRowSum);
  294. console.log('test:obj ' +  obj.MinRowSum);
  295. console.log('test:obj ' +  obj.MaxRowSum_RowNumber);
  296. console.log('test:obj ' +  obj.MinRowSum_RowNumber);
  297.  
  298. }
  299. })();
  300.  
  301. }

三、测试

  1. var std = new TableDom();
  2.  
  3. //华东师范大学研究生招生数据网址:https://yjszs.ecnu.edu.cn/system/sslqmd_list.asp?yxid=160
  4. var option = {
  5. tableIndex: 2,
  6. tds_indexs: [5, 6, 7, 8],
  7. tds_isUseful: [true, true, true, true],
  8. startIndex: 3,
  9. endIndex: 40,
  10. exe: ["getRowMaxMinSumData_Line"]
  11. }
  12.  
  13. //华南理工大学高考招生数据网址:http://202.38.194.145/Bachelor/Admission/1bl541elndfdu.xhtml
  14. // var option = {//对应理科段
  15. // tableIndex: 0,
  16. // tds_indexs: [2, 3, 4],
  17. // tds_isUseful: [true, true, true],
  18. // exe: ["getRowMaxMinSumData_Line"],
  19. // startIndex:1,
  20. // endIndex:92,
  21. // }
  22.  
  23. std.getTableData(option);

四、效果

[声明:  1.博文原创, 未经同意转载必究,欢迎相互交流]

[声明:  2.博主未知情况下转载,需显著处注明博文来源]

[声明:  3.谢谢尊重劳动成果,谢谢理解与配合~]

JavaScript之获取表格目标数据(TableDom.getTableData())的更多相关文章

  1. Javascript class获取回调函数数据

    /********************************************************************** * Javascript class获取回调函数数据 * ...

  2. js遍历获取表格内数据方法

    1.一般的表格结构如下 <table> <tr> <td>id</td> <td>name</td> </tr> & ...

  3. Jquery DataTables 获取表格数据及行数据

    注意table变量是 1.jQuery DataTables 行号获取 $("#example tbody tr").on("click", function( ...

  4. Jquery DataTables 获取表格数据

    1.获取表格所有数据 function getTableContent(){ var nTrs = table.fnGetNodes();//fnGetNodes获取表格所有行,nTrs[i]表示第i ...

  5. 在Bootstrap开发框架中使用dataTable直接录入表格行数据

    在Winform开发的时候,我们很多时候可以利用表格控件来直接录入数据,不过在Web上较少看到,其实也可以利用dataTable对象处理直接录入表格行数据,这个可以提高数据的录入方便,特别是在一些简单 ...

  6. 在Bootstrap开发框架中使用dataTable直接录入表格行数据(2)--- 控件数据源绑定

    在前面随笔<在Bootstrap开发框架中使用dataTable直接录入表格行数据>中介绍了在Web页面中使用Jquery DataTable插件进行对数据直接录入操作,这种处理能够给用户 ...

  7. Atitit  项目界面h5化静态html化计划---vue.js 把ajax获取到的数据 绑定到表格控件 v2 r33.docx

    Atitit  项目界面h5化静态html化计划---vue.js 把ajax获取到的数据 绑定到表格控件 v2 r33.docx 1. 场景:应用在项目列表查询场景下1 1.1. 预计初步掌握vue ...

  8. jQuery获取表格隐藏域与ajax请求数据结合显示详情

    0.表格样式

  9. javascript生成表格增删改查 JavaScript动态改变表格单元格内容 动态生成表格 JS获取表格任意单元格 javascript如何动态删除表格某一行

    jsp页面表格布局Html代码 <body onload="show()"> <center> <input type="text" ...

随机推荐

  1. python中 Lambda,Map,Filter,Itertools,Generator高级函数的用法

    Lambda 函数 Lambda 函数是一种比较小的匿名函数--匿名是指它实际上没有函数名. Python 函数通常使用 def a_function_name() 样式来定义,但对于 lambda ...

  2. hdu5521(Meeting)spfa 层次网络最短路

    题意:给出几个集合,每个集合中有Si个点 且任意两个点的距离为ti,现在要求两个人分别从1和n出发,问最短多长时间才能遇到,且给出这些可能的相遇点; 取两个人到达某点时所用时间大的值 然后取最小的   ...

  3. 自学Zabbix11.2 Zabbix SNMP安装

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix11.2 Zabbix SNMP安装 1. yum安装snmp 1 # yum i ...

  4. 【BZOJ3456】城市规划(生成函数,多项式运算)

    [BZOJ3456]城市规划(生成函数,多项式运算) 题面 求\(n\)个点的无向连通图个数. \(n<=130000\) 题解 \(n\)个点的无向图的个数\(g(n)=2^{C_n^2}\) ...

  5. CodeForces - 669D

    题目链接:http://codeforces.com/problemset/problem/669/D Little Artem is fond of dancing. Most of all dan ...

  6. .net连接ORACLE数据库

    这段时间维护客户的一个系统,该系统使用的是ORACLE数据库,之前开发的时候用的都是MSSQL,并没有使用过ORACLE.这两种数据库虽然都是关系型数据库,但是具体的操作大有不同,这里作下记录. 连接 ...

  7. C# 面向对象的封装、继承、多态

    一.封装: 封装:把客观的事物封装成类,使用和修改方便: 作用和结构体使用方法相似,程序执行流程不同: 要点:成员变量,属性,成员方法,构造函数,成员方法的静态和非静态,命名空间,常用的访问修饰符pu ...

  8. A1090. Highest Price in Supply Chain

    A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ...

  9. 约会 音频mm教你追女孩

    微信吧地址发给他人. 美团提前选好环境然后提前打电话订购一个位置. 微博作用是为:更多的谈资.热搜 ,最近上榜的话题说. 打车软件: 地图: 2.外表: 下澡,指甲,胡子,发型,适合服装.发型和服装搭 ...

  10. 20145215《网络对抗》Exp8 Web基础

    20145215<网络对抗>Exp8 Web基础 基础问题回答 什么是表单? 表单是一个包含表单元素的区域,表单元素是允许用户在表单中(比如:文本域.下拉列表.单选框.复选框等等)输入信息 ...