goods-add.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. /**
  2. * 页面注意事项:
  3. * 1、 .Father_Title 这个类作用是取到所有标题的值,赋给表格,如有改变JS也应相应改动
  4. * 2、 .Father_Item 这个类作用是取类型组数,有多少类型就添加相应的类名:如: Father_Item1、Father_Item2、Father_Item3 ...
  5. */
  6. $(function() {
  7. $(document).on('change', '.choose_config li', function() { // controls warp 包 下的 所有label
  8. let len5 = $('tbody td img').length
  9. console.log(len5, 'len')
  10. var parent=$(this).parents('.Father_Item'); // 父级
  11. var _this=$('.checkbox',this); // 指向 label 作用域
  12. // 是否全选
  13. $('.checkbox',parent).each(function() { // 在 Father_Item 作用域下
  14. var bCheck2=true;
  15. let isok = _this.hasClass('check_all')
  16. if (_this.hasClass('check_all')) { // 全选
  17. if (_this.get(0).checked) {
  18. bCheck2=true;
  19. $('.check_item',parent).prop('checked', bCheck2); // prop 获取在匹配的元素集中的第一个元素的属性值。
  20. }else{
  21. bCheck2=false;
  22. $('.check_item',parent).prop('checked', bCheck2);
  23. }
  24. return false;
  25. } else {
  26. if ((!this.checked)&&(!$(this).hasClass('check_all'))) { // 全选 设为false
  27. bCheck2 = false;
  28. $('.check_all',parent).prop('checked', bCheck2);
  29. return false;
  30. }
  31. }
  32. $('.check_all',parent).prop('checked', bCheck2);// 全选 bCheck2 设为false or true
  33. });
  34. step.Creat_Table();
  35. });
  36. var step = {
  37. // 信息组合
  38. Creat_Table: function() {
  39. step.hebingFunction();
  40. var SKUObj = $('.Father_Title'); // 表格标题 颜色 内存 尺寸大小
  41. var arrayTile = []; // 表格标题数组
  42. var arrayInfor = []; // 盛放每组选中的CheckBox值的对象
  43. var arrayColumn = []; // 指定列,用来合并哪些列
  44. var bCheck = true; // 是否全选,只有全选,表格才会生成
  45. var columnIndex = 0;
  46. $.each(SKUObj, function(i, item) {
  47. arrayColumn.push(columnIndex++);
  48. let title = SKUObj.eq(i).text().replace(':', '');
  49. if(title == '颜色'){
  50. arrayTile.push(title);
  51. arrayTile.push('图片');
  52. }else{
  53. arrayTile.push(title);
  54. }
  55. var itemName = '.Father_Item' + i; //类型下的 ul Father_Item0 Father_Item1 累加
  56. var bCheck2 = true; // 是否全选
  57. // 获取选中的checkbox的值
  58. var order = [];
  59. $(itemName + ' .check_item:checked').each(function() {
  60. order.push($(this).val());
  61. });
  62. console.log(order, 'order');
  63. arrayInfor.push(order);
  64. if (order.join() === '') { // 如果不全选 就不生成
  65. bCheck = false;
  66. }
  67. })
  68. // 开始生成表格
  69. if (bCheck) {
  70. $('#createTable').html('');
  71. var table = $('<table id="process" class="columnList"></table>');
  72. table.appendTo($('#createTable'));
  73. var thead = $('<thead></thead>');
  74. thead.appendTo(table);
  75. var trHead = $('<tr></tr>');
  76. trHead.appendTo(thead);
  77. // 创建表头
  78. var str = '';
  79. $.each(arrayTile, function(index, item) { // arrayTile 规格 内存 颜色 等
  80. str += '<th width="100">' + item + '</th>';
  81. })
  82. str += '<th width="200">价格</th>'; // 追加了 两栏
  83. trHead.append(str); // 生成头部
  84. // trHead.prepend('<th width="100">图片</th>'); // 生成头部
  85. var tbody = $('<tbody></tbody>'); // 建立 tbody
  86. tbody.appendTo(table); // 建立 table 插入 tbody
  87. var zuheDate = step.doExchange(arrayInfor);
  88. if (zuheDate.length > 0) {
  89. //创建行
  90. $.each(zuheDate, function(index, item) {
  91. var td_array = item.split(',');
  92. var tr = $('<tr></tr>');
  93. tr.appendTo(tbody); //建立 tbody 插入 tr
  94. var str = '';
  95. $.each(td_array, function(i, values) {
  96. str += '<td>' + values + '</td>';
  97. });
  98. str += '<td ><input name="Txt_PriceSon" class="inpbox inpbox-mini" type="text"></td>';
  99. tr.append(str);
  100. });
  101. }
  102. //结束创建Table表
  103. arrayColumn.pop(); //删除数组中最后一项
  104. //合并单元格
  105. $(table).mergeCell({
  106. // 目前只有cols这么一个配置项, 用数组表示列的索引,从0开始
  107. cols: arrayColumn
  108. });
  109. } else {
  110. //未全选中,清除表格
  111. document.getElementById('createTable').innerHTML = "";
  112. }
  113. },
  114. hebingFunction: function() {
  115. $.fn.mergeCell = function(options) {
  116. return this.each(function() {
  117. var cols = options.cols;
  118. for (var i = cols.length - 1; cols[i] !== undefined; i--) {
  119. mergeCell($(this), cols[i]);
  120. }
  121. dispose($(this));
  122. })
  123. };
  124. function mergeCell($table, colIndex) {
  125. $table.data('col-content', ''); // 存放单元格内容
  126. $table.data('col-rowspan', 1); // 存放计算的rowspan值 默认为1
  127. $table.data('col-td', $()); // 存放发现的第一个与前一行比较结果不同td(jQuery封装过的), 默认一个"空"的jquery对象
  128. $table.data('trNum', $('tbody tr', $table).length); // 要处理表格的总行数, 用于最后一行做特殊处理时进行判断之用
  129. // 进行"扫面"处理 关键是定位col-td, 和其对应的rowspan
  130. $('tbody tr', $table).each(function(index) {
  131. // td:eq中的colIndex即列索引
  132. var $td = $('td:eq(' + colIndex + ')', this);
  133. // 获取单元格的当前内容
  134. let currentContent = $td.html();
  135. // 第一次时走次分支
  136. if ($table.data('col-content') === '') {
  137. $table.data('col-content', currentContent);
  138. $table.data('col-td', $td);
  139. } else {
  140. // 上一行与当前行内容相同
  141. if ($table.data('col-content') === currentContent) {
  142. // 上一行与当前行内容相同则col-rowspan累加, 保存新值
  143. var rowspan = $table.data('col-rowspan') + 1;
  144. $table.data('col-rowspan', rowspan);
  145. // 值得注意的是 如果用了$td.remove()就会对其他列的处理造成影响
  146. $td.hide();
  147. // 最后一行的情况比较特殊一点
  148. // 比如最后2行 td中的内容是一样的, 那么到最后一行就应该把此时的col-td里保存的td设置rowspan
  149. // 最后一行不会向下判断是否有不同的内容
  150. if (++index === $table.data('trNum')) {
  151. console.log($table.data('trNum'), '$table.data(trNum)', index)
  152. $table.data('col-td').attr('rowspan', $table.data('col-rowspan'));
  153. }
  154. }
  155. // 上一行与当前行内容不同
  156. else {
  157. // col-rowspan默认为1, 如果统计出的col-rowspan没有变化, 不处理
  158. if ($table.data('col-rowspan') !== 1) {
  159. $table.data('col-td').attr('rowspan', $table.data('col-rowspan'));
  160. }
  161. // 保存第一次出现不同内容的td, 和其内容, 重置col-rowspan
  162. $table.data('col-td', $td);
  163. $table.data('col-content', currentContent);
  164. $table.data('col-rowspan', 1);
  165. }
  166. }
  167. })
  168. }
  169. // 同样是个private函数 清理内存之用
  170. function dispose($table) {
  171. $table.removeData();
  172. }
  173. },
  174. doExchange(doubleArrays, status=false) {
  175. // 二维数组,最先两个数组组合成一个数组,与后边的数组组成新的数组,依次类推,知道二维数组变成以为数组,所有数据两两组合
  176. var len = doubleArrays.length;
  177. if (len >= 2) {
  178. var arr1 = doubleArrays[0];// 颜色值
  179. var arr2 = doubleArrays[1];// 内存值
  180. var len1 = arr1.length; // 3
  181. var len2 = arr2.length; // 3
  182. var newLen = len1 * len2; // 9
  183. var temp = new Array(newLen); // 9 arr
  184. var index = 0;
  185. for (var i = 0; i < len1; i++) {// 颜色值 三次
  186. for (var j = 0; j < len2; j++) { // 内存值三次
  187. if(!status){
  188. temp[index++] = arr1[i]+(',<i class="layui-icon layui-icon-upload-drag up-img-btn" id="tbId'+i+'" data-index="'+i+'"></i>,') + arr2[j]; // 颜色值 拼接内存值
  189. }else{
  190. temp[index++] = arr1[i]+',' + arr2[j]; // 颜色值 拼接内存值
  191. }
  192. }
  193. }
  194. // 总共 temp 9次
  195. var newArray = new Array(len-1); // 三个数组
  196. newArray[0] = temp; // 9个 组 ,颜色,内存
  197. if (len > 2) {
  198. let _count = 1;
  199. for (let i = 2; i < len; i++) {
  200. newArray[_count++] = doubleArrays[i];
  201. }
  202. }
  203. return step.doExchange(newArray, true);
  204. } else {
  205. return doubleArrays[0];
  206. }
  207. }
  208. }
  209. })