Подтвердить что ты не робот

Лучшая практика хранения HTML-шаблонов на странице?

Я разрабатываю довольно сильный JavaScript-интерфейс для сайта, который я создаю, и решил использовать (недавно сделанный официальный) jQuery шаблоны плагин, чтобы генерировать мои элементы из моих запросов в JSON API. Теперь проблема, с которой я сейчас сталкиваюсь:

Я склонен иметь кучу этих шаблонов. Один для каждого типа объектов, некоторые для списков, некоторые для разделов страницы и т.д. Есть ли какой-либо предпочтительный способ хранения этих шаблонов? Я читал об определении тега <script> с помощью id с использованием имени шаблона, а затем извлекал текст оттуда (как описывает Джона Ресига в " JavaScript Micro-Templating" ), но наличие нескольких тегов <script> на каждой странице выглядит немного хакерским.

Итак, вопрос в том, есть ли "наилучшая практика" для такого рода сценариев?

4b9b3361

Ответ 1

Почему бы просто не загружать шаблоны в скрытый элемент, а затем использовать $(template).clone()? Это экономит много беглых головных болей. Я не могу говорить о производительности на .clone() по сравнению с подходом <script>, но могу сказать, что дополнительные теги script - это штраф за производительность и просто делают код грязным.

Почему?

  • Несмотря на то, что у вас есть утилитарная утилита для удаления, ошибки все равно будут сделаны, и их будет намного труднее прочитать. Плюс, если вам нужно работать в командной ситуации, особенно если люди закатывают/откатывают проект, это может быть нелегко понять.

  • вы можете создать объект-указатель, скажем, templates = {}, и загрузить его с помощью указателей объектов jquery в ваши элементы, похожие на клонирование:

     templates = {};
     templates.message = $("#templates .message");
     templates.dialog = $("#templates .dialog");
    

теперь все, что вам нужно сделать, чтобы создать новый шаблон:

var newDialog = templates.dialog.clone();

Вы можете сделать функцию-оболочку для принятия параметров, а затем добавить их с помощью newDialog.find("title").html(title), newDialog.find("message").html(message), и т.д.

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

Еще одним важным аспектом производительности является выбор времени... если вы испытываете задержки в производительности, вы должны обязательно разбить свои куски длинного исполняемого кода с помощью setTimeout. Он создает новый стек и позволяет браузеру рисовать то, что он уже обработал до точки непосредственно перед созданием нового стека. Это очень помогает при рассмотрении визуальных задержек как часть проблемы с производительностью (как правило, наиболее часто встречающаяся проблема производительности, особенно не-кодировщики). Если вам нужна дополнительная информация, отправьте мне сообщение, и я соберу некоторые ресурсы. Ограниченное время прямо сейчас, пуская огонь на работу.:)

Ответ 2

Недавно я сделал это упражнение, и хотя подход тега <script> кажется немного взломанным, я принял это как хорошее решение и выбрал свою собственную версию (версия Джона Реджига обволакивает очень хорошо, но я пошел сам по себе понятный для моей собственной версии мозга)

Моя версия является базовым шаблоном и заменой с использованием заменяемых значений в form ##VALUE##

ШАБЛОН: (шаблон одного шаблона или шаблон строки)

<script type="text/html" id="ItemTemplate">
<table>
  <tr>
    <td>##LABEL1##</td>
    <td>##VALUE1##</td>
  <tr>
</table>
</script>

СОДЕРЖАНИЕ КОНСТРУКЦИИ:

function constructFromTemplate(content, values, appendTo) {
    var modifiedHtml = content;
    modifiedHtml = modifiedHtml.replace(new RegExp('__', 'g'), '##');

    $.each(values, function (n, v) {
        modifiedHtml = modifiedHtml.replace(new RegExp('##' + n + '##', 'g'), v);
    });

    if (appendTo != null) 
    {
        $(appendTo).append(modifiedHtml);
        //initializePageElements();
    }

    return modifiedHtml;
}

ИСПОЛЬЗОВАНИЕ

Содержимое будет возвращено из функции и/или вы можете установить параметр appendTo, чтобы установить elementID автоматически append содержимое. (установите null не append)

Заменимые значения просто добавляются как динамический объект, где имена object являются заменяемыми элементами.

var theContent = constructFromTemplate(ItemTemplate, { LABEL1: 'The Label 1 content', LABEL2: 'The Label 2 content' }, null);

Примечание: Я прокомментировал //initializePageElements();, это используется для инициализации плагинов jQuery, стилей в шаблоне.

Только встроенные стили, кажется, работают при вставке содержимого в DOM

Ответ 3

посмотрите https://github.com/inspiraller/STQuery

STQuery использует все те же имена методов, что и jquery, но вместо того, чтобы манипулировать элементами в dom, он работает непосредственно над строкой:

var strTemplate = '<div id="splog"><h1>lorem ipsum</h1><div class="content">lorem ipsum</div></div>';

var ST = STQuery(strTemplate);

ST.find('h1').html('Hello');
ST.find('.content').html('World!');

var strTemplateUpdated = ST.html();

Это сохраняет логику отдельно от шаблона, т.е. ненавязчивые html-шаблоны.

Преимущества перед jquery состоят в том, что STQuery не нужно сначала записывать в DOM, что означает, что вы можете использовать веб-работников или выполнять все ваши манипуляции с шаблонами на сервере. Примечание. Начиная с этого сообщения, stquery был написан только в javascript, поэтому его нужно будет преобразовать на выбранный на стороне сервера язык.

Ответ 4

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

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

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

Мне бы очень хотелось услышать, как другие решают эту проблему.

Ответ 5

Я успешно использовал script с моей инфраструктурой jquery pure html templates

Что касается лучших практик, ознакомьтесь с новым интерфейсом twitter, используя одну страницу для всего и только внутреннюю маршрутизацию через "#!/paths".

Использование одностраничных веб-сайтов для очередного большого шага для веб-приложений, лично мне нравится называть его web 3.0:). Это также устранит проблему с тем же шаблоном на каждой странице - у вас будет только одна страница.

Ответ 6

В asp.net mvc я часто собираю свои общие шаблоны в частичном представлении, которое я могу включить там, где оно мне нужно. Таким образом, мне не нужно повторять свои шаблоны повсюду.

Другой подход заключается в том, чтобы ваши шаблоны в отдельных файлах. Как newslist.tmpl.html, который позволяет вам загрузить шаблон с помощью ajax. Учитывая это можно сделать параллельно с загрузкой данных, это не должно замедлять ваше приложение, так как оно, скорее всего, быстрее, чем вызов данных.