У меня есть массив, который я просматриваю. Каждый раз, когда условие выполняется, я хочу добавить копию приведенного HTML
ниже кода в элемент контейнера с некоторыми значениями.
Где я могу разумно использовать этот HTML-код повторно?
<a href="#" class="list-group-item">
<div class="image">
<img src="" />
</div>
<p class="list-group-item-text"></p>
</a>
JQuery
$('.search').keyup(function() {
$('.list-items').html(null);
$.each(items, function(index) {
// APPENDING CODE HERE
});
});
javascript
jquery
json
Патрик Рек
источник
источник
Ответы:
Вы можете решить использовать в своем проекте механизм шаблонов, например:
Если вы не хотите включать другую библиотеку, John Resig предлагает решение jQuery , подобное приведенному ниже.
Браузеры и программы чтения с экрана игнорируют нераспознанные типы скриптов:
При использовании jQuery добавление строк на основе шаблона будет напоминать:
источник
Старый вопрос, но поскольку вопрос спрашивает «с использованием jQuery», я подумал, что предоставлю вариант, который позволит вам сделать это, не вводя зависимости от поставщика.
Хотя существует множество движков шаблонов, многие из их функций в последнее время перестали пользоваться популярностью, при этом iteration (
<% for
), conditionals (<% if
) и transforms (<%= myString | uppercase %>
) рассматриваются в лучшем случае как микроязык, а в худшем - как анти-шаблоны. Современные методы создания шаблонов поощряют простое отображение объекта в его представление DOM (или другое), например, то, что мы видим со свойствами, сопоставленными с компонентами в ReactJS (особенно с компонентами без состояния).Шаблоны внутри HTML
Одно свойство, на которое вы можете положиться для сохранения HTML-кода вашего шаблона рядом с остальной частью вашего HTML, - это использование неисполняемого
<script>
type
, например<script type="text/template">
. Для вашего случая:При загрузке документа прочтите свой шаблон и токенизируйте его, используя простой
String#split
Обратите внимание, что с нашим токеном вы получаете его в альтернативном
[text, property, text, property]
формате. Это позволяет нам красиво отображать егоArray#map
с помощью функции сопоставления:Куда
props
могло быть похоже{ url: 'http://foo.com', img: '/images/bar.png', title: 'Lorem Ipsum' }
.Собираем все вместе, предполагая, что вы проанализировали и загрузили свой,
itemTpl
как указано выше, и у вас естьitems
массив в области видимости:Этот подход также едва ли соответствует jQuery - вы должны иметь возможность использовать тот же подход, используя ванильный javascript с
document.querySelector
и.innerHTML
.jsfiddle
Шаблоны внутри JS
Задайте себе вопрос: действительно ли вам нужно / нужно определять шаблоны как файлы HTML? Вы всегда можете разбить на компоненты + повторно использовать шаблон так же, как вы бы повторно использовали большинство вещей, которые хотите повторить: с функцией.
В es7-land, используя деструктуризацию, строки шаблонов и стрелочные функции, вы можете написать совершенно красивые функции компонентов, которые можно легко загрузить с помощью
$.fn.html
описанного выше метода.Тогда вы могли бы легко отобразить его, даже если он был отображен из массива, например:
Ну и последнее замечание: не забудьте очистить свои свойства, переданные в шаблон, если они читаются из БД или кто-то может передать HTML (а затем запустить сценарии и т. Д.) С вашей страницы.
источник
Вместо этого используйте HTML-шаблон!
Поскольку принятый ответ будет представлять собой метод сценария перегрузки, я хотел бы предложить другой, который, на мой взгляд, намного чище и безопаснее из-за рисков XSS, связанных с сценариями перегрузки.
Я сделал демонстрацию, чтобы показать вам, как использовать его в действии и как вставлять один шаблон в другой, редактировать и затем добавлять в DOM документа.
пример html
пример js
HTML <шаблон>
+ Его содержимое эффективно инертно до активации. По сути, ваша разметка скрыта DOM и не отображается.
+ Любой контент в шаблоне не будет иметь побочных эффектов. Скрипты не запускаются, изображения не загружаются, звук не воспроизводится ... пока не будет использован шаблон.
+ Контент считается отсутствующим в документе. Использование
document.getElementById()
илиquerySelector()
на главной странице не вернет дочерние узлы шаблона.+ Шаблоны могут быть размещены в любом месте внутри
<head>
,<body>
или<frameset>
и может содержать любой тип контента , который разрешен в этих элементах. Обратите внимание, что "где угодно" означает, что его<template>
можно безопасно использовать в местах, запрещенных анализатором HTML.Отступать
Поддержка браузера не должна быть проблемой, но если вы хотите охватить все возможности, вы можете легко проверить:
Некоторые сведения о методе сценария перегрузки
<script>
тег имеетdisplay:none
по умолчанию."text/javascript"
..innerHTML
. Анализ строки во время выполнения данных, предоставленных пользователем, может легко привести к уязвимости XSS.Полная статья: https://www.html5rocks.com/en/tutorials/webcomponents/template/#toc-old
Полезная ссылка: https://developer.mozilla.org/en-US/docs/Web/API/Document/importNode http://caniuse.com/#feat=queryselector
СОЗДАНИЕ ВЕБ-КОМПОНЕНТОВ Руководство по созданию пользовательских веб-компонентов с использованием HTML-шаблонов от Trawersy Media: https://youtu.be/PCWaFLy3VUo
источник
template
Элемент не поддерживается Internet Explorer (по состоянию на 2018 год, IE11). Протестировано с использованием примера 580 из w3c.github.io/html/single-page.html .<template>
, хотя я бы рекомендовал свободно использовать классы, чтобы было ясно, какие реквизиты для чего устанавливаются. Для правильного отображения ваших данных в шаблоне по-прежнему требуются некоторые навыки js, особенно с использованием подхода в стиле компонентов для сопоставления больших наборов данных. Лично мне по-прежнему нравится просто создавать HTML в функциях или, в идеале, строить DOM непосредственно с помощью самого JS и вообще отказываться от HTML (например, как это делает React).Добавить где-нибудь в теле
затем создайте css
и добавьте в свой js
источник
.children().clone()
, чем.html()
. Скорость около 3: 1 для случайного, которое<tr/>
я имел на странице, использующей этот кодi=10000; time=performance.now(); while (--i) {$a.clone().append(0 ? $b.html() : $b.children().clone())} performance.now()-time
. Это соотношение на самом деле немного более преувеличено, потому что я использую $ a.clone (), но попытка очистить его на каждой итерации больше снижает производительность, чем клонирование, поэтому я не уверен, как сделать его более точным, потому что Функции синхронизации имеют свою стоимость.Другая альтернатива: Pure
Я использую его, и он мне очень помог. Пример, показанный на их сайте:
HTML
JSON
результат
источник
Для решения этой проблемы я признаю два решения:
Первый идет с AJAX, с помощью которого вам придется загружать шаблон из другого файла и просто добавлять каждый раз, когда захотите
.clone()
.Учтите, что событие должно быть добавлено после завершения ajax, чтобы быть уверенным, что данные доступны!
Второй - напрямую добавить его в любом месте исходного html, выбрать его и скрыть в jQuery:
После добавления нового экземпляра шаблона вы можете
То же, что и предыдущий, но если вы не хотите, чтобы шаблон оставался там, а только в javascript, я думаю, вы можете использовать (не тестировали!)
.detach()
Вместо hide..detach()
удаляет элементы из DOM, сохраняя при этом данные и события (.remove () нет!).источник
Очень хороший ответ от DevWL об использовании собственного элемента шаблона HTML5 . Чтобы внести свой вклад в этот хороший вопрос из OP, я хотел бы добавить, как использовать этот
template
элемент с помощью jQuery, например:Содержимое
template
не html, а просто обрабатывается как данные, поэтому вам нужно обернуть содержимое в объект jQuery, чтобы затем получить доступ к методам jQuery.источник