teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

バグ修正版ソースを追加

2016/04/14 07:36

投稿

tkturbo
tkturbo

スコア5572

answer CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  ```javascript
4
4
  function switchColsAndRows(tabid){
5
+ // バグ放置版
5
6
  var cols = [];
6
7
  var rowIndex = 0;
7
8
  var maxColSize = 0;
@@ -47,5 +48,66 @@
47
48
  tab.append(tr[0]);
48
49
  }
49
50
  }
51
+ ```
50
52
 
53
+ 追記:
54
+ 上のソースは戒めとして放置。
55
+ ・一つのtd/thタグにcolspan、rowspanの両方が設定されているときに表示が壊れるのを修正
56
+ ・ CertaiNさんの指摘にあったrowspanのネスト時に表示が壊れるのを修正
57
+
58
+
59
+ ```javascript
60
+ // たぶん完成版???
61
+ function switchColsAndRows(tabid){
62
+ var cols = [];
63
+ var rowIndex = 0;
64
+ var maxColSize = 0;
65
+ var tab = $('#' + tabid);
66
+ // consider colspan value first
67
+ tab.find('tr').each(function(){
68
+ if(!cols[rowIndex]){ cols[rowIndex] = []; }
69
+ var colIndex = 0;
70
+ $(this).find('td, th').each(function(){
71
+ var colspan = $(this).attr('colspan');
72
+ var colsize = (!colspan)?1:parseInt(colspan);
73
+ cols[rowIndex][colIndex] = $(this)[0];
74
+ for(var k = 1; k < colsize; k++){
75
+ cols[rowIndex][colIndex + k]={ omittable:true, rowspan:$(this).attr('rowspan')};
76
+ }
77
+ colIndex += colsize;
78
+ maxColSize = (cols[rowIndex].length > maxColSize)?cols[rowIndex].length:maxColSize;
79
+ });
80
+ rowIndex++;
81
+ });
82
+ // consider rowspan value next
83
+ for(var i = 0; i < cols.length; i++){
84
+ for(var j = 0; j < cols[i].length; j++){
85
+ var rowspan = $(cols[i][j]).attr('rowspan');
86
+ rowspan = (rowspan)?rowspan:cols[i][j].rowspan;
87
+ var rowsize = (!rowspan)?1:parseInt(rowspan);
88
+ for(var x = 1; x < rowsize && cols[i+x]; x++){
89
+ cols[i+x].splice(j, 0, { omittable : true, rowspan : 1});
90
+ }
91
+ }
92
+ }
93
+ tab.empty();
94
+ var initAttr = function(elm,name,val){$(elm).removeAttr(name);$(elm).attr(name, val);};
95
+ var replaceAttr = function(elm,name1,name2,v1,v2){
96
+ v1=$(elm).attr(name1);v2=$(elm).attr(name2);
97
+ initAttr(elm,name1,v2);initAttr(elm,name2,v1);
98
+ };
99
+ // rebuild table
100
+ for(var i = 0; i < maxColSize; i++){
101
+ var tr = $('<tr />');
102
+ for(var j = 0; j < cols.length; j++){
103
+ if(cols[j] && cols[j][i] && (!cols[j][i].omittable)){
104
+ var col = cols[j][i];
105
+ replaceAttr(col, 'rowspan', 'colspan');
106
+ tr.append(col);
107
+ }
108
+ }
109
+ tab.append(tr[0]);
110
+ }
111
+ }
112
+
51
- ```
113
+ ```