task-02.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. // Задание на синий пояс.
  2. // -------------УСЛОВИЕ-------------
  3. // Сделать HTML-конструктор из деревянной структуры, которая была на прошлом занятии:
  4. // var someTree = {
  5. // tagName: "table", //html tag
  6. // subTags: [ //вложенные тэги
  7. // {
  8. // tagName: "tr",
  9. // subTags: [
  10. // {
  11. // tagName: "td",
  12. // text: "some text",
  13. // },
  14. // {
  15. // tagName: "td",
  16. // text: "some text 2",
  17. // }
  18. // ]
  19. // }
  20. // ],
  21. // attrs:
  22. // {
  23. // border: 1,
  24. // },
  25. // }
  26. // Для начала сделайте конструктор для верхнего уровня (в примере - table). Потом с помощью копипасты сделайте то же самое
  27. // с вложенным уровнем nestedTags(tr).Аналогично для уровня td.
  28. // Конструктор должен поддерживать вложенность до 3его уровня (как в примере).
  29. // В результате работы конструктора из примера выше должен получиться следующий HTML(в строке str):
  30. // <table border=1>
  31. // <tr>
  32. // <td>some text</td>
  33. // <td>some text 2</td>
  34. // </tr>
  35. // </table>
  36. // Переносы строк и отступы в результате не принципиальны, главное - структура HTML Проверьте ваш код на других структурах.
  37. // -------------РЕШЕНИЕ-------------
  38. const task15block = document.createElement('div');
  39. task15block.style = "border: 2px solid green; border-radius:5px; margin-bottom:10px; padding:10px";
  40. const task15title = document.createElement('h2');
  41. task15title.innerText = 'Task-15 Задание на синий пояс: HTML-конструктор';
  42. const task15comment = document.createElement('p');
  43. task15comment.innerText = 'Реализовано построение HTML-дерева любой глубины вложенности';
  44. const makeTableBtn = document.createElement('button');
  45. makeTableBtn.innerText = 'Make HTML-table';
  46. makeTableBtn.style = 'margin-bottom:15px';
  47. const makeFormBtn = document.createElement('button');
  48. makeFormBtn.innerText = 'Make HTML-form';
  49. makeFormBtn.style = 'margin-bottom:15px; margin-left:15px';
  50. root.appendChild(task15block);
  51. task15block.appendChild(task15title);
  52. task15block.appendChild(task15comment);
  53. task15block.appendChild(makeTableBtn);
  54. task15block.appendChild(makeFormBtn);
  55. //Функция построения HTML-строки из объекта данных
  56. let str = '';
  57. function elementParse(inputData) {
  58. const objData=JSON.parse(JSON.stringify(inputData));
  59. let strFin = '';
  60. for (let key in objData) {
  61. if (key === 'tagName') {
  62. str += '<' + objData[key]+'>' ;
  63. strFin = '</' + objData[key] + '>';
  64. }
  65. if (key === 'attrs') {
  66. str = str.slice(0, -1);
  67. for (let attrKey in objData[key]) { str += ` ${attrKey}="${objData[key][attrKey]}"`; }
  68. str += '>';
  69. }
  70. if (key === 'text') {
  71. str += objData[key] ;
  72. }
  73. if (key === 'subTags') {
  74. let subElements = [...objData[key]];
  75. for (let subData of subElements) {
  76. elementParse(subData);
  77. }
  78. }
  79. };
  80. str += strFin;
  81. }
  82. makeTableBtn.onclick = () => {
  83. str = '';
  84. var table = {
  85. tagName: 'table',
  86. attrs: {
  87. border: "1",
  88. },
  89. subTags: [
  90. {
  91. tagName: 'tr',
  92. subTags: [
  93. {
  94. tagName: "td",
  95. text: "1x1",
  96. },
  97. {
  98. tagName: "td",
  99. text: "1x2",
  100. },
  101. ]
  102. },
  103. {
  104. tagName: 'tr',
  105. subTags: [
  106. {
  107. tagName: "td",
  108. text: "2x1",
  109. },
  110. {
  111. tagName: "td",
  112. text: "2x2",
  113. },
  114. ]
  115. }
  116. ]
  117. }
  118. elementParse(table);
  119. console.log(`HTML:${str}`);
  120. const task15HTML = document.createElement('div');
  121. task15HTML.innerHTML = str;
  122. task15block.appendChild(task15HTML);
  123. }
  124. makeFormBtn.onclick = () => {
  125. str = '';
  126. const body = {
  127. tagName: "body",
  128. subTags: [
  129. {
  130. tagName: "div",
  131. subTags:
  132. [
  133. {
  134. tagName: "span",
  135. text: "Enter a data please:"
  136. },
  137. {
  138. tagName: "br"
  139. },
  140. {
  141. tagName: "input",
  142. attrs: {
  143. type: "text",
  144. id: "name"
  145. }
  146. },
  147. {
  148. tagName: "input",
  149. attrs: {
  150. type: "text",
  151. id: "surname"
  152. }
  153. }
  154. ]
  155. },
  156. {
  157. tagName: "div",
  158. subTags:
  159. [
  160. {
  161. tagName: "button",
  162. attrs: {
  163. id: "ok"
  164. },
  165. text: "OK"
  166. },
  167. {
  168. tagName: "button",
  169. attrs: {
  170. id: "cancel"
  171. },
  172. text: "Cancel"
  173. }
  174. ]
  175. }
  176. ]
  177. }
  178. elementParse(body);
  179. console.log(`HTML:${str}`);
  180. const task15HTML = document.createElement('div');
  181. task15HTML.innerHTML = str;
  182. task15block.appendChild(task15HTML);
  183. }