1. ホーム
  2. Web制作
  3. HTML/Xhtml

HTMLテーブルの空白セル補完方法

2022-01-07 07:36:55

私がWeb制作を独学で始めた頃は、DIV/CSSレイアウトなんてものはなく、テーブルレイアウトが主流でした。その時、パレットの空白セルをどう補完するかという問題が出てきました。--これは、会社の商品ページを制作しているときに頭を悩ませたことでした。プログラムを学んでいなかったので、この問題のアルゴリズムに少し遭遇しただけで、どうしようもなくなってしまったんですね。ちなみに、ページングのアルゴリズムには、ちょっと翻弄された記憶があります。

パリセイドとは、3行×4列=計12セルの表のことです。商品が10個しかない場合、テーブルの10セルしか埋めることができず、残りは空白になります。空白であっても、<td></td>要素はレンダリングしなければ、テーブルの形が崩れてしまいます。deadを書くのはいいのですが、表はASPで動的にレンダリングされます。なので、空白のtdをどう計算し、どう表示するかが問題なのです。私はいくつかの方法を考えていた、振り返ると非常に確かに非常に合理的ではない、要するに、死んだ馬である......ライン上に表示することができます......ハァッ。

DIV/CSS時代にTableは放棄された。だからアルゴリズムも気にしなくなった。--でも、あるプロジェクトで、テーブルレイアウトがまだ使えることがわかったので、この小さな問題を考えてみたんです。JSで動的に制御したコードは、こんな感じ。

/**
 * @class renderTable
 * Input an array and columns to generate a markup for a table.
 * @param {Array} list
 * @param {Number} cols
 * @param {Function} getValue
 */
define(function(require, exports, module) {
 module.exports = function (list, cols, getValue){
  this.list = list;
  this.cols = cols || 5;
  
  this.getValue = getValue || this.getValue;
 }
 
 module.exports.prototype = (new function(){
  this.render = function(list){
   list = list || this.list;
   
   var len = list.length ;
   var cols = this.cols;// number of bits
   var rows;
   var remainder = len % cols;
   var htmls = [];
    rows = len / remainder;
    
   if(remainder == 0){ // divisible without remainder
    list.forEach(addTr.bind({
     cols : cols,
     htmls: htmls,
     getValue : this.getValue
    }));
   }else{ // handle the remainder part
    var remainnerArr = list.splice(list.length - remainder);
    
    list.forEach(addTr.bind({
     cols : cols,
     htmls: htmls,
     getValue : this.getValue
    }));
   
    // Fill in the empty space
    var emptyArr = new Array(cols - remainnerArr.length);
    emptyArr = emptyArr.join('empty');
    emptyArr = emptyArr.split('empty');
    // remainder + empty space
    remainnerArr = remainnerArr.concat(emptyArr);
    
    if(remainnerArr.length ! = cols){
     throw 'Last line length error! The length should be ' + cols;
    }
    remainnerArr.forEach(addTr.bind({
     cols : cols,
     htmls: htmls,
     getValue : this.getValue
    }));
   }
   
   
   return addTable(htmls.join(''));
  }
  
  /**
   * The default function to get the displayed value. Generally want to override this function.
   * @param {Mixed}
   * @return {String}
   */
  this.getValue = function(data){
   return data;
  }
   
  /**
   * Add a <td></td> for each value. If a line is full add a </tr></tr>
   * @param {Mixed} item
   * @param {Number} i
   * @param {Array} arr
   */
  function addTr(item, i, arr){
   var html = '<td>' + this.getValue(item) + '</td>';
   
   if(i == 0){
    html = '<tr>' + html;
   }else if((i + 1) % this.cols == 0 && i ! = 0){
    html += '</tr><tr>';
   }else if(i == arr.length){
    html += '</tr>';
   }
   
   this.htmls.push(html);
  }
  
  /**
   * 
   * @param {String} html
   */
  function addTable(html){
   return '<table>' + html + '</table>';
 // var table = document.createElement('table');
 // table.innerHTML = html;
 // table.border="1";
 // document.body.appendChild(table);
  }
 });
});

と思われるかもしれませんが、結局転職することになったので......ちょっとした"テクニカル"問題が障害になりました............。

2019-5-18 JSTLの取り組み。

<%
 // Blank cell completion
 String tds = ""; int maxTds = 9; 
 List<? > list = (List<? >)request.getAttribute("list");
 for(int i = 0; i < (maxTds - list.size()); i++ ) {
  tds += "<td></td>";
 }
 
 request.setAttribute("tds", tds);
%>
  <table>
   <tr>
    <c:foreach items="${list}" var="item">
     <td>
      <h3>${item.name}----${totalCount}</h3>
      <p></p>
      <div></div>
     </td>
     <c:if test="${((currentIndex + 1) % 3) == 0}">
   </tr>
   <tr>
    </c:if>
    <c:if test="${((currentIndex + 1) == totalCount) && (totalCount ! = 9)}">
     ${tds}
    </c:if>
    </c:foreach>
   </tr>
  </table>

今回の記事は、HTMLテーブルの空白セル補完を実装する方法についてです。HTMLテーブルの空白セル補完については、スクリプトハウスの過去記事を検索していただくか、以下の関連記事を引き続き閲覧していただき、今後ともスクリプトハウスをよろしくお願いいたします。