Динамическое формирование таблицы на JavaScript.

Опубликовано: 8 февраля 2012 Автор: admin

В своей практике неоднократно встречал ситуации, когда заказчики получают готовый сайт, прекрасно разбираются с CMS, без проблем наполняют его контентом, а вот когда приходится на какой-либо странице добавить таблицу с данными, то здесь возникают трудности: HTML не знаком, а каждый раз просить кого-то нарисовать таблицу в виде рисунка или сверстать ее – тоже не выход.

В общем, совсем недавно меня попросили пользователи Wordpress придумать какое-то решение. Как известно, редактор этой популярной CMS позволяет работать в режиме html-редактора, а это значит, что остается решить проблему лишь с формированием кода таблицы.

Я решил написать небольшой скрипт, который как раз решает последнюю задачу. То есть пользователь, не знакомый с премудростями верстки сайтов, просто вбивает нужные параметры таблицы, добавляет в ячейки нужные данные, жмет на кнопку и ему в качестве результата предоставляется готовый код таблицы.

Я бы мог написать этот скрипт на php, но мне уж очень хотелось попрактиковаться в использовании JavaScript и я решил все сделать так, чтобы пользователь получал нужные данные без какого-либо обновления страницы, то есть создать что-то вроде динамического формирования и изменения таблицы.

Готовый результат здесь. Все неоднократно тестилось, однако, если все же будут обнаружены баги, прошу сообщить:)

Сам код скрипта ниже. Как вы можете видеть, здесь множество функций по изменению атрибутов таблицы. При изменении количества ячеек пользователем, скрипт динамически формирует новые столбцы и строки, либо же удаляет их.

Для динамического формирования таблицы используются такие функции:

insertCell() – добавление ячейки
deleteCell() – удаление ячейки
insertRow() – добавление строки
deleteRow() – удаление строки

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
<script type="text/javascript" language="javascript">
nrow=2;//количество строк по умолчанию
ncells=2;//количество столбцов по умолчанию
bs="none";//стиль границ таблицы по умолчанию
cellpadd=0;//отступ от границы до содержимого по умолчанию
 
//проверка: удалить или добавить строку?
function change_tr() {
rows = document.getElementById("rows");
if(rows.value-nrow>0){
	addrow();
}
else {
    if(rows.value>0)
    {
    delrow();
    }
}
}
 
//функция добавления строк
function addrow() {
rows = document.getElementById("rows");
ecells=document.getElementById("ecells");
for(i=0;i<rows.value-nrow;i++)
{
var newrow = mytable.insertRow(0);
for(k=0;k<ecells.value;k++)
{
newrow.insertCell(0).innerHTML = "<input type='text' value='текст'size='4'>";
}
}
nrow=rows.value;
}
 
//функция удаления строк
function delrow() {
var rows = document.getElementById("rows");
var lastrowindex=mytable.rows.length-1;
for(i=0;i<Math.abs(nrow-rows.value);i++) {
mytable.deleteRow(lastrowindex);
lastrowindex=lastrowindex-1;
}
nrow=rows.value;
}
 
//проверка: добавить столбцы или уменьшить?
function change_cells() {
var ecells = document.getElementById("ecells");
if(ecells.value-ncells>0){
	addcells();
}
else {
    if(ecells.value>0)
    {
    delcells();
    }
}
}
//добавление столбцов
function addcells() {
var ecells = document.getElementById("ecells");
for(i=0;i<mytable.rows.length;i++)
{
rowname=mytable.rows[i];
for(e=0;e<Math.abs(ecells.value-ncells);e++)
{
rowname.insertCell(0).innerHTML = "<input type='text' value='текст'size='4'>";
}
}
ncells=ecells.value;
}
//удаление столбцов
function delcells() {
var ecells = document.getElementById("ecells");
for(i=0;i<mytable.rows.length;i++)
{
rowname=mytable.rows[i];
for(e=0;e<Math.abs(ecells.value-ncells);e++)
{
rowname.deleteCell(0);
}
}
ncells=ecells.value;
 
}
//изменение цвета границ
function addbordercolor() {
 switch(document.getElementById("bordcolor").selectedIndex){
	case 0:
	bc="black";
	break;
	case 1:
	bc="red";
	break;
	case 2:
	bc="green";
	break;
	case 3:
	bc="blue";
	break;
	case 4:
	bc="#806b08";
	break;
	}
}
//изменение отображения внешних границ
function addframe() {	
  switch(document.getElementById("bordframe").selectedIndex) {
	case 0:
	bframe="border";
	break;
	case 1:
	bframe="void"; 
	break;
	case 2:
	bframe="above";  
	break;
	case 3:
	bframe="below";
	break;
	case 4:
	bframe="rhs";
	break;
	case 5:
	bframe="lhs"; 
	break;
	case 6:
	bframe="hsides";
	break;
	case 7:
	bframe="vsides";
	break;
	}
}
//изменение отображения внутренних границ
function addrules() {
 switch (document.getElementById("bordrules").selectedIndex) {
	case 0:
	brul="all";
	break;
	case 1:
	brul="none";
	break;
	case 2:
	brul="cols";
	break;
	case 3:
	brul="rows";
	break;
	}
}
//расположение содержимого ячейки
function change_align() {
 switch (document.getElementById("cell_align").selectedIndex) {
	case 0:
	cellal="center";
	break;
	case 1:
	cellal="left";
	break;
	case 2:
	cellal="right";
	break;
	}
}
 
//формирование итоговой таблицы и кода
function get_result() {
var inputnum=document.getElementsByTagName("input");
var inindex=4;//поля для ввода данных в ячейки таблицы начинаются с 5-го input 
bord=document.getElementById("bord");
cellpadd = document.getElementById("cellpadd").value;	
bodyt="<table "+"border="+bord.value+" bordercolor='"+bc+"' frame='"+bframe+"'"+" rules='"+brul+"' cellpadding="+cellpadd+">";
rows=document.getElementById("rows");
ecells=document.getElementById("ecells");
<!--формируем первую строку-заголовок--->
bodyt=bodyt+"<tr align=center>";
for(n=0;n<ecells.value;n++)
     {
bodyt=bodyt+"<td><b>"+inputnum[inindex].value+"</b></td>";
  inindex=inindex+1;
	 }
bodyt=bodyt+"</tr>";
<!--формируем тело таблицы--->
for(x=0;x<rows.value-1;x++)
  {
   bodyt=bodyt+"<tr align="+cellal+">";
     for(n=0;n<ecells.value;n++)
     {
      bodyt=bodyt+"<td>"+inputnum[inindex].value+"</td>";
      inindex=inindex+1;
	 }
   bodyt=bodyt+"</tr>";
  }
bodyt=bodyt+"</table>";
document.getElementById("result").innerHTML=bodyt;
document.getElementById("itog_code").innerHTML="<textarea cols=100 rows=10 readonly>"+bodyt+"</textarea>";
}
 
</script>
</head>
 
<body>
<div id="content">
<h1>1.Укажите свойства таблицы:</h1>
<table>
<tr><td>Количество строк:</td><td><input type="number"name="rows"id="rows"size="20" onchange="change_tr()" value="2"></td></tr>
<tr><td>Количество столбцов:</td><td><input type="number"id="ecells"name="ecells"size="20"onchange="change_cells()"value="2"></td></tr>
<tr><td>Отступ от рамки до содержимого таблицы (cellpadding), px:</td><td> <input type="number"id="cellpadd"name="cellpadd"size="2"value="0"></td></tr>
<tr><td>Граница таблицы в пикселях:</td><td><input type="text"id="bord"name="bord"size="20"value="1"></td></tr>
<tr><td>Цвет границ таблицы:</td><td>
<select size="1" name="bordcolor"id="bordcolor"onchange="addbordercolor()">
  <option>черный</option>
  <option>красный</option>
  <option>зеленый</option>
  <option>синий</option>
  <option>коричневый</option>
</select>
</td></tr>
<tr><td>Отображение внешних границ таблицы (frame):</td><td>
<select size="1" name="bordframe"id="bordframe"onchange="addframe()">
  <option>все границы</option>
  <option>нет внешних границ</option>
  <option>граница по верхнему краю таблицы</option>
  <option>граница по нижнему краю таблицы</option>
  <option>граница по правому краю таблицы</option>
  <option>граница по левому краю таблицы</option>
  <option>границы по верхнему и нижнему краям таблицы</option>
  <option>граница по левому и правому краям таблицы</option>
</select>
</td></tr>
<tr><td>Отображение внутренних границ таблицы (rules):</td><td>
<select size="1" name="bordrules"id="bordrules"onchange="addrules()">
  <option>все внутренние границы</option>
  <option>нет границ</option>
  <option>границы между столбцами</option>
  <option>границы между строками</option>
</select>
</td></tr>
<tr><td>Выравнивание содержимого ячеек:</td><td>
<select size="1" name="cell_align"id="cell_align"onchange="change_align()">
  <option>по центру</option>
  <option>по левому краю</option>
  <option>по правому краю</option>
</select>
</td></tr>
</table>
 
<h1>2.Введите значения в ячейки таблицы:</h1>
 
 
<table id="my_table"name="my_table"cellpadding="2">
<thead>
<tr><th><input type="text" value="текст"size="4"></th><th><input type="text" value="текст"size="4"></th></tr>
</thead>
<tbody>
<tr>
<td><input type="text" value="текст"size="4"></td>
<td><input type="text" value="текст"size="4"></td>
</tr>
</tbody>
</table>
 
 
<h1>3.Все готово?</h1>
<button onclick="get_result()">Посмотреть и получить код</button>
<div id="result"name="result"></div>
<div id="itog_code"name="itog_code"></div>
</div>
 
<script>
//установка значений по умолчанию в полях при перезагрузке страницы (для вредных браузеров) 
document.getElementById("rows").value=2;
document.getElementById("ecells").value=2;
document.getElementById("cellpadd").value=0;
document.getElementById("bord").value=1;
 
//установка всех других значений переменных при загрузке страницы или ее перезагрузке
mytable = document.getElementById("my_table");
addframe();
addrules();
addbordercolor();
change_align();
</script>

Категория: JavaScript для сайта

Оставить комментарий