Как скопировать div внутри html (желательно с параметрами)?
Добрый день,
разрабатываю одностраничник в виде веб-интерфейса аппаратуры, в котором уже больше 100 страниц документации. Примерно 40% этой документации повторяется. Документация вся расположена в <div id=Label_1> ..... </div> мне хочется скопировать внутри html все содержимое из <div id=Label_1> куда-то дальше. Пока я это делал так: <div id="Label_1_cp" ></div> <script>CP("Label_1_cp","Label_1");</script> где-то вверху написав function CP(a,b) { document.getElementById(a).innerHTML=document.getElementById(b).innerHTML; } Скажите, пожалуйста, а можно ли скопировать содержимое какого-то div в заданное место как-то еще короче, не заводя новый id= и не вызывая JS? То есть хочется что-то типа: <div XXX=Label_1></div> но я не знаю, как XXX называется, подскажите, пожалуйста! Очень часто надо еще сложнее конструкцию, у меня в документации есть пара параметров, которые надо поменять при копировании. Вот если бы я писал в ЛаТеХе или на гипотетическом С для браузера, то я бы завел define с параметрами, и раскрывал бы этот define в нескольких местах. Скажите, пожалуйста, а можно в html тоже так сделать? Спасибо! |
Ну я бы вам советовал использовать сборку и компонентный подход.
Красиво по папочкам разложить куски, а потом импортировать их где надо. Но это потребует более глубокого изучения. Попробуйте заюзать Vue, он довольно лёгок для понимания и применения. Если нет - попробуйте шаблонизаторы по-проще, тот же handlebars например. Ну а пока вот вам функция которая после загрузки ищет все элементы с одинаковым атрибутом data-id на странице и заполняет пустые из полных: https://jsfiddle.net/Lwoetghq/1/ :) addEventListener('DOMContentLoaded', function() { var forEach = Function.prototype.call.bind(Array.prototype.forEach); var attribute = 'data-id'; var map = {}; forEach(document.querySelectorAll('[' + attribute + ']'), function(element) { var id = element.getAttribute(attribute); if(!map[id]) map[id] = []; if(element.hasChildNodes()) { var fragment = document.createDocumentFragment(); forEach(element.childNodes, function(node) { fragment.appendChild(node.cloneNode(true)); }); if(map[id].parent) { console.warn('[Два не-пустых элемента с одинаковым %s: %o и %o]', attribute, map[id].parent, element) } map[id].parent = element; map[id].fragment = fragment; } else { map[id].push(element); } }); for(var id in map) { var fragment = map[id].fragment; if(fragment) { map[id].forEach(function(element) { element.appendChild(fragment.cloneNode(true)); }) } } }) P.S. По написанию доков мне больше всего понравилась сборка из отдельных файлов маркдауна с кастомными расширениями в живой сайт(пример), но это ещё более хитрая вещь.) |
Спасибо большое, Aetae,
сборку пока частично сам делаю, а плодить файлы не хотел, так как у меня похоже на приборе не будет полноценного веб сервера, я планировал просто по входу на IP посылать один единственный файл, что зашит в приборе и далее общаться только сокетами. По крайней мере именно так у меня все сейчас организовано. Заметил, что в основном у меня просто копируются куски текста. То есть текст где-то в начале лежит в одном div, и мне надо его потом несколько раз встроить где я хочу. Иметь метку на каждый текст - не проблема. Пока доупрощал до состояния: <div id=Label_1> ..... </div> <div id="Label_1_0"></div><script>CP(1,0);</script> где function CP(a,n) { document.getElementById("Label_"+a+"_"+n).innerHTML=document.getElementById("Label_"+a).innerHTML; } основной проблемой является то, что каждый раз надо дописывать свой уникальный номер: <div id="Label_1_0"></div><script>CP(1,0);</script> ... <div id="Label_1_1"></div><script>CP(1,1);</script> ... <div id="Label_1_2"></div><script>CP(1,2);</script> ... <div id="Label_1_3"></div><script>CP(1,3);</script> и хочется это избежать, иначе будет путаница при редакции. В принципе могу парсер написать и присваивать такой номер автоматически. Но, как-то не логично, что в html нет возможности воткнуть содержимое в div из другого или вызвать при создании специальную функцию, которая сделает такое копирование. Вдруг кто-то что-то похожее знает, пожалуйста, подскажите! Спасибо! |
Цитата:
|
дублирование содержимого в другие блоки
Was-Ja,
попытка облегчить понимание решения, предложенного Aetae, :) <!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> </style> <script> addEventListener('DOMContentLoaded', function() { var forEach = Function.prototype.call.bind(Array.prototype.forEach); var attribute = 'data-for'; forEach(document.querySelectorAll('[' + attribute + ']'), function(element) { var cls = element.getAttribute(attribute); var fragment = document.createDocumentFragment(); forEach(element.childNodes, function(node) { fragment.appendChild(node.cloneNode(true)); }); forEach(document.querySelectorAll(cls), function(element) { element.appendChild(fragment.cloneNode(true)) }) }); }) </script> </head> <body> <div class="add"></div> <div data-for='.label, .test' >это пример, будет во всех <b>div</b> с классами указанными в атрибуте <i>data-for</i>'.label, .test'</div> <div class="label"></div> <div class="label"></div> <div class="label"></div> <div class="label"></div> <div class="red">а тут ничего не изменится</div> <div class="test"></div> <div class="test"></div> <div class="test"></div> <div class="add"></div> <div data-for='.add' >это пример, будет во всех <b>div</b> с классами указанными в атрибуте <i>data-for</i>'.add'</div> </body> </html> |
Я тормоз, я зациклился на одном и том же id у дива, и поэтому не смог понять пример Aetae, а, оказывается, это все делалось через одинаковые классы, которые задаются через data-for. Теперь понял! Простите, пожалуйста, тормоза!
СПАСИБО ОГРОМНОЕ!!! Именно то, что хотелось! |
Часовой пояс GMT +3, время: 13:52. |