[前端] HTML Table 空白单元格补全的实现方法

2663 0
Honkers 2022-10-19 15:56:58 | 显示全部楼层 |阅读模式
在最初自学 Web 开发的时候,那时没有所谓的 DIV/CSS 布局,一概 Table 布局的天下。当时有个问题就来了,如何补全宫格空白的单元格呢?——这是我在弄公司产品页头痛的问题。因为我不是学程序出身的,碰到这稍带算法的问题,就束手无策了,呵呵。顺带说说,记得分页的算法还折腾了我一下呢。
所谓宫格,就是说表格,3 行x 4 列 = 共12 单元格。如果只有 10 个产品,就只能填充表格 10 个单元格,其余的为空白。虽然空白,但也要渲染 <td></td> 元素,不然 table 会看起来会走样。写死当然可以,但问题 table 都是经过 ASP 动态渲染的。所以怎么计算,怎么该显示空白 td 就是个问题。我当时想了几个方法,回想起来很当然很不是合理,总之都是死马当活马医……能显示就行……呵呵。
后来到了 DIV/CSS 时代,Table 遭弃用。于是该算法也没关心了。——再后来一次项目中,发现 table 布局仍然适用的,于是就琢磨了一下这小问题。用 JS 动态控制的代码如下:
  1. /**
  2. * @class renderTable
  3. * 输入一个数组 和 列数,生成一个表格 table 的 markup。
  4. * @param {Array} list
  5. * @param {Number} cols
  6. * @param {Function} getValue
  7. */
  8. define(function(require, exports, module) {
  9. module.exports = function (list, cols, getValue){
  10.   this.list = list;
  11.   this.cols = cols || 5;
  12.   this.getValue = getValue || this.getValue;
  13. }
  14. module.exports.prototype = (new function(){
  15.   this.render = function(list){
  16.    list = list || this.list;
  17.    var len = list.length ;
  18.    var cols = this.cols;// 位数
  19.    var rows;
  20.    var remainder = len % cols;
  21.    var htmls = [];
  22.     rows = len / remainder;
  23.    if(remainder == 0){ // 可整除 无余数 直接处理
  24.     list.forEach(addTr.bind({
  25.      cols : cols,
  26.      htmls: htmls,
  27.      getValue : this.getValue
  28.     }));
  29.    }else{ // 处理余数部分
  30.     var remainnerArr = list.splice(list.length - remainder);
  31.     list.forEach(addTr.bind({
  32.      cols : cols,
  33.      htmls: htmls,
  34.      getValue : this.getValue
  35.     }));
  36.     // 填空位
  37.     var emptyArr = new Array(cols - remainnerArr.length);
  38.     emptyArr = emptyArr.join('empty');
  39.     emptyArr = emptyArr.split('empty');
  40.     // 余数部分 + 空位
  41.     remainnerArr = remainnerArr.concat(emptyArr);
  42.     if(remainnerArr.length != cols){
  43.      throw '最后一行长度错误!长度应该为' + cols;
  44.     }
  45.     remainnerArr.forEach(addTr.bind({
  46.      cols : cols,
  47.      htmls: htmls,
  48.      getValue : this.getValue
  49.     }));
  50.    }
  51.    return addTable(htmls.join(''));
  52.   }
  53.   /**
  54.    * 默认的获取显示值的函数。一般要覆盖该函数。
  55.    * @param {Mixed}
  56.    * @return {String}
  57.    */
  58.   this.getValue = function(data){
  59.    return data;
  60.   }
  61.   /**
  62.    * 为每个值加个 <td></td>。若满一行加一个 </tr></tr>
  63.    * @param {Mixed} item
  64.    * @param {Number} i
  65.    * @param {Array} arr
  66.    */
  67.   function addTr(item, i, arr){
  68.    var html = '<td>' + this.getValue(item) + '</td>';
  69.    if(i == 0){
  70.     html = '<tr>' + html;
  71.    }else if((i + 1) % this.cols == 0 && i != 0){
  72.     html += '</tr><tr>';
  73.    }else if(i == arr.length){
  74.     html += '</tr>';
  75.    }
  76.    this.htmls.push(html);
  77.   }
  78.   /**
  79.    *
  80.    * @param {String} html
  81.    */
  82.   function addTable(html){
  83.    return '<table>' + html + '</table>';
  84. //  var table = document.createElement('table');
  85. //  table.innerHTML = html;
  86. //  table.border="1";
  87. //  document.body.appendChild(table);
  88.   }
  89. });
  90. });
复制代码
大大们可能觉得这可是一闪而过就有思路的问题……但我那时毕竟是在转行……稍有点“技术含量”的问题都成了我的拦路虎……
2019-5-18 JSTL 的方式:
  1. <%
  2. // 空白单元格补全
  3. String tds = ""; int maxTds = 9;
  4. List<?> list = (List<?>)request.getAttribute("list");
  5. for(int i = 0; i < (maxTds - list.size()); i++ ) {
  6.   tds += "<td></td>";
  7. }
  8. request.setAttribute("tds", tds);
  9. %>
  10.   <table>
  11.    <tr>
  12.     <c:foreach items="${list}" var="item">
  13.      <td>
  14.       <h3>${item.name}----${totalCount}</h3>
  15.       <p></p>
  16.       <div></div>
  17.      </td>
  18.      <c:if test="${((currentIndex + 1) % 3) == 0}">
  19.    </tr>
  20.    <tr>
  21.     </c:if>
  22.     <c:if test="${((currentIndex + 1) == totalCount) && (totalCount != 9)}">
  23.      ${tds}
  24.     </c:if>
  25.     </c:foreach>
  26.    </tr>
  27.   </table>
复制代码
到此这篇关于HTML Table 空白单元格补全的实现方法的文章就介绍到这了,更多相关HTML Table 空白单元格补全内容请搜索中国红客联盟以前的文章或继续浏览下面的相关文章,希望大家以后多多支持中国红客联盟!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行