table.core.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. /**
  2. * Created with JetBrains PhpStorm.
  3. * User: taoqili
  4. * Date: 13-2-21
  5. * Time: 下午1:31
  6. * To change this template use File | Settings | File Templates.
  7. */
  8. function getTable(str) {
  9. var div = document.getElementById("testTable");
  10. if (!div) {
  11. div = document.createElement("div");
  12. div.id = "testTable";
  13. document.body.appendChild(div);
  14. }
  15. div.innerHTML = "<table border='1'>" + str + "</table>";
  16. return div.firstChild;
  17. }
  18. UT = UE.UETable;
  19. test("create UETable", function () {
  20. var table = getTable("<tr><td>ddd</td></tr>"),
  21. ut = new UT(table);
  22. ok(ut.table === table, "UT对象创建成功");
  23. ok(ut.colsNum == 1 && ut.rowsNum == 1, "单元格行、列数为1");
  24. });
  25. test("getMaxRows", function () {
  26. var table = getTable("<tr><td>1</td><td>2</td><td>3</td></tr>" +
  27. "<tr><td>1</td><td>2</td><td>3</td></tr>"),
  28. ut = new UT(table);
  29. var maxRows = ut.getMaxRows();
  30. equal(maxRows, 2, "最大行数为2");
  31. table = getTable("<tr><td rowspan='3'>1</td><td>2</td><td rowspan='2'>3</td></tr>" +
  32. "<tr><td>2</td></tr>");
  33. ut = new UT(table);
  34. maxRows = ut.getMaxRows();
  35. equal(maxRows, 3, "最大行数为3");
  36. });
  37. test("getMaxCols", function () {
  38. var table = getTable("<tr><td>1</td><td>2</td><td>3</td></tr>" +
  39. "<tr><td>1</td><td>2</td><td>3</td></tr>"),
  40. ut = new UT(table);
  41. var maxCols = ut.getMaxCols();
  42. equal(maxCols, 3, "最大列数为3");
  43. table = getTable("<tr><td rowspan='3'>1</td><td>2</td><td rowspan='2'>3</td></tr>" +
  44. "<tr><td>2</td><td colspan='3'></td></tr>");
  45. ut = new UT(table);
  46. maxCols = ut.getMaxCols();
  47. equal(maxCols, 6, "最大列数为6");
  48. });
  49. test("ie9 active trace 3728 getSameEndPosCells", function () {
  50. if(ua.browser.ie>9)return;
  51. var table = getTable("<tr><td rowspan='2'>1</td><td>2</td><td>3</td></tr><tr><td>2</td><td>3</td></tr>"),
  52. ut = new UT(table);
  53. var cell = table.rows[0].cells[0],
  54. cells1 = ut.getSameEndPosCells(cell, "x"),
  55. cells2 = ut.getSameEndPosCells(cell, "y");
  56. ok(cells1.length == 1, "获取到同样X轴结尾位置的cell1个");
  57. ok(cells2.length == 2, "获取到同样Y轴结尾位置的cell2个");
  58. });
  59. test("getHSideCell", function () {
  60. var table = getTable("<tr><td rowspan='2'>1</td><td>2</td><td>3</td></tr>" +
  61. "<tr><td>2</td><td>3</td></tr>"),
  62. ut = new UT(table);
  63. var rows = table.rows,
  64. cell = rows[1].cells[1],
  65. cell1 = ut.getHSideCell(cell),
  66. cell2 = ut.getHSideCell(cell, true);
  67. equal(cell1, rows[1].cells[0], "左边单元格");
  68. equal(cell2, null, "位于右边缘的单元格无右邻居单元格");
  69. equal(ut.getHSideCell(rows[0][0]), null, "位于左边缘的单元格无左邻居单元格");
  70. });
  71. test("getVSideCell", function () {
  72. var table = getTable("<tr><td rowspan='2'>1</td><td>2</td><td>3</td></tr>" +
  73. "<tr><td>2</td><td>3</td></tr>"),
  74. ut = new UT(table);
  75. var rows = table.rows,
  76. cell = rows[1].cells[1],
  77. cell1 = ut.getVSideCell(cell),
  78. cell2 = ut.getVSideCell(cell, true),
  79. cell3 = ut.getVSideCell(cell, true, true);
  80. equal(cell1, rows[0].cells[2], "上边单元格");
  81. equal(cell2, null, "位于下边缘的单元格无下邻居单元格");
  82. equal(cell3, null, "位于左边缘的单元格无左邻居单元格");
  83. });
  84. test("setCellContent", function () {
  85. var table = getTable("<tr><td rowspan='2'>1</td><td>2</td><td>3</td></tr>" +
  86. "<tr><td>2</td><td>3</td></tr>"),
  87. ut = new UT(table);
  88. var cell = table.rows[0].cells[0];
  89. ut.setCellContent(cell, "这是测试内容");
  90. equal(cell.innerHTML, "这是测试内容", "设置了正确的内容");
  91. ut.setCellContent(cell);
  92. equal(cell.innerHTML, browser.ie ? domUtils.fillChar : "<br>");
  93. });
  94. test("cloneCell", function () {
  95. var table = getTable("<tr><td style='border-top-color: red;border-bottom-color: green' rowspan='2'>1</td><td>2</td><td>3</td></tr>" +
  96. "<tr><td class='selectedClass'>2</td><td>3</td></tr>"),
  97. ut = new UT(table);
  98. var cell = ut.cloneCell(table.rows[0].cells[0]);
  99. equal(cell.rowSpan, 2, "clone了一个2行一列的单元格");
  100. equal(cell.style.borderTopColor, "green", "上边框的颜色将会被下边框取代");
  101. cell = ut.cloneCell(table.rows[0].cells[0], true);
  102. ok(cell.rowSpan, 1, "忽略被合并单元格时将会充值单元格的rowspan和colspan为1")
  103. });
  104. test("getCellsRange、getCells", function () {
  105. var table = getTable("<tr><td rowspan='2'>1</td><td>2</td><td>3</td></tr>" +
  106. "<tr><td class='selectedClass'>2</td><td>3</td></tr>"),
  107. ut = new UT(table);
  108. var range = ut.getCellsRange(table.rows[0].cells[1], table.rows[1].cells[0]);
  109. ok(range.beginRowIndex === 0 && range.beginColIndex === 1 && range.endRowIndex === 1 && range.endColIndex === 1, "获取到range")
  110. var cells = ut.getCells(range);
  111. ok(cells.length == 2, "获取到2个单元格");
  112. ok(cells[0] == table.rows[0].cells[1], "第一个单元格存在");
  113. });
  114. test("insertRow、deleterRow", function () {
  115. var table = getTable("<tr><td rowspan='2'>1</td><td>2</td><td>3</td></tr>" +
  116. "<tr><td class='selectedClass'>2</td><td>3</td></tr>"),
  117. ut = new UT(table);
  118. var cellPrototype = document.createElement("td");
  119. cellPrototype.innerHTML = "aa";
  120. cellPrototype.setAttribute("vAlign", "top");
  121. ut.insertRow(2, cellPrototype);
  122. ok(table.rows.length === 3, "行数变成3行");
  123. ok(table.rows[2].cells[0].getAttribute("vAlign") == "top", "新插入的单元格中包含原型单元格中的属性");
  124. });
  125. test("mergeRight,mergeDown", function () {
  126. var table = getTable("<tr><td rowspan='3'>1</td><td>2</td><td>3</td><td rowspan='2'>4</td><td>5</td><td>6</td></tr>" +
  127. "<tr><td>2</td><td>3</td><td>5</td><td>6</td></tr>" +
  128. "<tr><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td></tr>"),
  129. ut = new UT(table);
  130. var cell = table.rows[0].cells[1];
  131. ut.mergeDown(cell);
  132. ok(cell.rowSpan === 2, "向下合并成功");
  133. ut.mergeDown(cell);
  134. ok(cell.rowSpan === 3, "向下合并成功");
  135. cell = cell.previousSibling;
  136. ut.mergeRight(cell);
  137. ok(cell.rowSpan === 3 && cell.colSpan === 2, "向右合并成功");
  138. equal(cell.parentNode.rowIndex, 0, "合并到了正确的位置")
  139. });
  140. test("mergeRange",function(){
  141. var table = getTable("<tr><td rowspan='3'>1</td><td>2</td><td>3</td><td rowspan='2'>4</td><td>5</td><td>6</td></tr>" +
  142. "<tr><td>2</td><td>3</td><td>5</td><td>6</td></tr>" +
  143. "<tr><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td></tr>"),
  144. ut = new UT(table);
  145. var range = ut.getCellsRange(table.rows[0].cells[1],table.rows[2].cells[3]);
  146. ut.setSelected(range);
  147. ut.mergeRange();
  148. ok(table.rows[0].cells[1].rowSpan===3,"合并选区")
  149. });
  150. test("split", function () {
  151. var table = getTable("<tr><td rowspan='3'>1</td><td>2</td><td>3</td><td rowspan='2' colspan='2'>4</td><td>6</td><td>7</td></tr>" +
  152. "<tr><td>2</td><td>3</td><td>6</td><td>7</td></tr>" +
  153. "<tr><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td></tr>"),
  154. ut = new UT(table);
  155. var cell = table.rows[0].cells[0],
  156. num = table.getElementsByTagName("td").length;
  157. ut.splitToCells(cell);
  158. ok(cell.rowSpan == 1 && cell.colSpan == 1, "单元格被成功拆分");
  159. var newNum = table.getElementsByTagName("td").length;
  160. ok(num + 2 == newNum, "单元格数量增加了2个");
  161. cell = table.rows[0].cells[3];
  162. ut.splitToCols(cell);
  163. ok(cell.colSpan === 1 && cell.rowSpan == 2, "被拆分成了2列");
  164. });
  165. test("selectRow", function () {
  166. var table = getTable("<tr><td rowspan='3'>1</td><td>2</td><td>3</td><td rowspan='2' colspan='2'>4</td><td>6</td><td>7</td></tr>" +
  167. "<tr><td>2</td><td>3</td><td>6</td><td>7</td></tr>" +
  168. "<tr><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td></tr>"),
  169. ut = new UT(table);
  170. ut.selectRow(1);
  171. equal(ut.selectedTds.length, table.getElementsByTagName("td").length, "选中了所有单元格")
  172. var cells = table.rows[1].cells,
  173. flag = false;
  174. utils.each(cells, function (cell) {
  175. if (cell.className == "") {
  176. flag = true;
  177. }
  178. });
  179. ok(!flag, "所有单元格都被选中");
  180. ok(ut.cellsRange.beginRowIndex === 0, "cellsRange正确");
  181. });
  182. test("selectTable", function () {
  183. var table = getTable("<tr><td rowspan='3'>1</td><td>2</td><td>3</td><td rowspan='2' colspan='2'>4</td><td>6</td><td>7</td></tr>" +
  184. "<tr><td>2</td><td>3</td><td>6</td><td>7</td></tr>" +
  185. "<tr><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td></tr>"),
  186. ut = new UT(table);
  187. ut.selectTable();
  188. ok(ut.selectedTds.length === table.getElementsByTagName("td").length, "选中了整个表格")
  189. });
  190. test("setBackground", function () {
  191. var table = getTable("<tr><td>01</td><td>2</td><td>3</td><td>4</td><td>6</td><td>7</td></tr>" +
  192. "<tr><td>11</td><td>2</td><td>3</td><td>4</td><td>6</td><td>7</td></tr>" +
  193. "<tr><td>21</td><td>2</td><td>3</td><td>4</td><td>6</td><td>7</td></tr>"),
  194. ut = new UT(table);
  195. ut.setBackground(table.getElementsByTagName("td"), "green");
  196. var cell = table.rows[1].cells[1];
  197. ok(cell.style.backgroundColor == "green", "单种背景颜色设置成功");
  198. ut.removeBackground(table.getElementsByTagName("td"));
  199. ok(cell.style.backgroundColor == "", "背景颜色被清除");
  200. ut.setBackground(table.getElementsByTagName("td"), {
  201. repeat:true,
  202. colorList:["green", "red"]
  203. });
  204. ok(table.rows[0].cells[0].style.backgroundColor == "green", "第一行的单元格为绿色");
  205. ok(table.rows[1].cells[0].style.backgroundColor == "red", "第二行的单元格为红色");
  206. ok(table.rows[2].cells[0].style.backgroundColor == "green", "第三行的单元格为绿色");
  207. ut.removeBackground(table.getElementsByTagName("td"));
  208. ut.setBackground(table.getElementsByTagName("td"), {
  209. repeat:false,
  210. colorList:["green", "red"]
  211. });
  212. ok(table.rows[0].cells[0].style.backgroundColor == "green", "第一行的单元格为绿色");
  213. ok(table.rows[1].cells[0].style.backgroundColor == "red", "第二行的单元格为红色");
  214. ok(table.rows[2].cells[0].style.backgroundColor == "", "第三行的单元格没有颜色");
  215. });
  216. test("isFullRow isFullCol", function () {
  217. var table = getTable("<tr><td>01</td><td>2</td><td>3</td><td>4</td><td>6</td><td>7</td></tr>" +
  218. "<tr><td>11</td><td>2</td><td>3</td><td>4</td><td>6</td><td>7</td></tr>" +
  219. "<tr><td>21</td><td>2</td><td>3</td><td>4</td><td>6</td><td>7</td></tr>"),
  220. ut = new UT(table);
  221. var range = ut.getCellsRange(table.rows[0].cells[0], table.rows[1].cells[1]);
  222. ut.setSelected(range);
  223. ok(!ut.isFullRow(), "不是整行");
  224. range = ut.getCellsRange(table.rows[0].cells[0], table.rows[0].cells[5]);
  225. ut.setSelected(range);
  226. ok(ut.isFullRow(), "是整行");
  227. range = ut.getCellsRange(table.rows[0].cells[0], table.rows[2].cells[0]);
  228. ut.setSelected(range);
  229. ok(ut.isFullCol(), "是整列");
  230. range = ut.getCellsRange(table.rows[0].cells[0], table.rows[1].cells[0]);
  231. ut.setSelected(range);
  232. ok(!ut.isFullCol(), "不是整列");
  233. });
  234. test("last", function () {
  235. var table = getTable("<tr><td>01</td><td>2</td><td>3</td><td>4</td><td>6</td><td>7</td></tr>" +
  236. "<tr><td>11</td><td>2</td><td>3</td><td>4</td><td>6</td><td>7</td></tr>" +
  237. "<tr><td>21</td><td>2</td><td>3</td><td>4</td><td>6</td><td>7</td></tr>"),
  238. ut = new UT(table);
  239. var cell = table.rows[2].cells[5];
  240. ok(ut.isLastCell(cell), "是最后一个单元格");
  241. ok(!ut.isLastCell(table.rows[1].cells[0]), "不是最后一个单元格");
  242. });
  243. test("getNextCell", function () {
  244. var table = getTable("<tr><td>01</td><td>2</td><td>3</td><td>4</td><td>6</td><td>7</td></tr>" +
  245. "<tr><td>11</td><td>2</td><td>3</td><td>4</td><td>6</td><td>7</td></tr>" +
  246. "<tr><td>21</td><td>2</td><td>3</td><td>4</td><td>6</td><td>7</td></tr>"),
  247. ut = new UT(table);
  248. var cell = table.rows[2].cells[5];
  249. var newCell = ut.getNextCell(cell);
  250. ok(newCell === table.rows[1].cells[5], "找到正确单元格");
  251. cell = table.rows[0].cells[4];
  252. newCell = ut.getNextCell(cell);
  253. ok(!newCell, "顶行不存在nextCell");
  254. newCell = ut.getNextCell(cell, true);
  255. ok(newCell === table.rows[1].cells[4], "获取到下一行的单元格");
  256. });
  257. test("getPreviewCell",function(){
  258. var table = getTable("<tr><td>01</td><td>2</td><td>3</td><td>4</td><td>6</td><td>7</td></tr>" +
  259. "<tr><td>11</td><td>2</td><td>3</td><td>4</td><td>6</td><td>7</td></tr>" +
  260. "<tr><td>21</td><td>2</td><td>3</td><td>4</td><td>6</td><td>7</td></tr>"),
  261. ut = new UT(table);
  262. var cell = table.rows[2].cells[5];
  263. var newCell = ut.getPreviewCell(cell);
  264. ok(newCell===cell.previousSibling,"找到前置单元格");
  265. });
  266. test("getLastCell", function () {
  267. var table = getTable("<tr><td>01</td><td>2</td><td>3</td><td>4</td><td>6</td><td>7</td></tr>" +
  268. "<tr><td>11</td><td>2</td><td>3</td><td>4</td><td>6</td><td>7</td></tr>" +
  269. "<tr><td>21</td><td>2</td><td>3</td><td>4</td><td>6</td><td>7</td></tr>"),
  270. ut = new UT(table);
  271. var cell = ut.getLastCell();
  272. ok(cell === table.rows[2].cells[5], "找到最后一个单元格");
  273. });
  274. test("getTabNextCell", function () {
  275. var table = getTable("<tr><td>01</td><td>2</td><td>3</td><td>4</td><td>6</td><td>7</td></tr>" +
  276. "<tr><td>11</td><td>2</td><td>3</td><td>4</td><td>6</td><td>7</td></tr>" +
  277. "<tr><td>21</td><td>2</td><td>3</td><td>4</td><td>6</td><td>7</td></tr>"),
  278. ut = new UT(table);
  279. var rows = table.rows,
  280. cell = rows[0].cells[0];
  281. var newCell = ut.getTabNextCell(cell);
  282. ok(newCell === table.rows[0].cells[1], "找到最后一个单元格");
  283. newCell = ut.getTabNextCell(rows[0].cells[5]);
  284. ok(newCell === table.rows[1].cells[0], "找到下一行的第一个单元格");
  285. });
  286. //test("getSameStartPosXCells", function () {
  287. // var table = getTable("<tr><td>01</td><td>2</td><td>3</td><td>4</td><td>6</td><td>7</td></tr>" +
  288. // "<tr><td>11</td><td>2</td><td>3</td><td>4</td><td>6</td><td>7</td></tr>" +
  289. // "<tr><td>21</td><td>2</td><td>3</td><td>4</td><td>6</td><td>7</td></tr>"),
  290. // ut = new UT(table);
  291. // var cell = table.rows[0].cells[1];
  292. // var cells = ut.getSameStartPosXCells(cell);
  293. // equal(cells.length, 3, "获取到三个单元格")
  294. //
  295. // table = getTable("<tr><td>01</td><td>2</td><td>3</td><td>4</td><td>6</td><td>7</td></tr>" +
  296. // "<tr><td>11</td><td>2</td><td>3</td><td>4</td><td>6</td><td>7</td></tr>" +
  297. // "<tr><td>21</td><td colspan='2'>2</td><td>4</td><td>6</td><td>7</td></tr>");
  298. // ut = new UT(table);
  299. // cells = ut.getSameStartPosXCells(cell);
  300. // ok(cells.length === 2, "获取到2个单元格");
  301. //
  302. // cells = ut.getSameStartPosXCells(table.rows[0].cells[0]);
  303. // ok(cells.length===3,"获取到三个单元格");
  304. //
  305. //});