Лучшая практика для хранения шаблонов HTML на странице? - PullRequest
23 голосов
/ 18 ноября 2010

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

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

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

Ответы [ 6 ]

8 голосов
/ 22 ноября 2010

Почему бы просто не загрузить ваши шаблоны в скрытый элемент, а затем использовать $(template).clone()? Это избавляет от побочных головных болей. Я не могу говорить о производительности на .clone() против подхода <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. Он создает новый стек и позволяет браузеру рисовать то, что уже обработано, до момента создания нового стека. Это очень помогает при работе с визуальными задержками как часть проблемы с производительностью (обычно это самая распространенная проблема с производительностью, особенно у не кодеров). Если вы хотите больше информации об этом, отправьте мне сообщение, и я соберу некоторые ресурсы. Сейчас ограниченное время, тушение пожаров на работе. :)

4 голосов
/ 18 ноября 2010

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

Моя версия является базовым шаблоном и заменой с использованием заменяемых значений в 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

2 голосов
/ 20 июля 2011

посмотрите на 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, поэтому его необходимо будет преобразовать в язык на стороне сервера.

1 голос
/ 20 ноября 2010

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

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

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

1 голос
/ 18 ноября 2010

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

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

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

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

0 голосов
/ 23 ноября 2010

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

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

...