Есть ли лучший способ заполнить HTML-виджеты, чем создание строк и установка innerHTML? - PullRequest
2 голосов
/ 19 августа 2010

С помощью XML XSLT можно построить красивый шаблон в HTML, преобразовать его в XSLT и использовать данные XML, поступающие с сервера, для динамического заполнения виджетов на стороне клиента.

JSON и JSONP великолепныдля взаимодействия со стороной сервера и манипулирования данными в JS.Когда дело доходит до визуализации данных JSON, в большинстве примеров, которые я видел, JS объединяет некрасивую строку и задает innerHTML некоторого элемента для ее визуализации.

Существует ли простой способ создания виджетов в формате HTML, совместимый с браузероми заполнить их JSON, который не включает в себя разбиение строк и создание элементов DOM?

Ответы [ 3 ]

1 голос
/ 19 августа 2010

Вы должны увидеть это сообщение в блоге Джона Ресика: Микро-шаблонирование JavaScript

Он имеет простой микро-шаблонный код, который вы можете использовать повторно.Это выглядит так:

// Simple JavaScript Templating
// John Resig - http://ejohn.org/ - MIT Licensed
(function(){
  var cache = {};

  this.tmpl = function tmpl(str, data){
    // Figure out if we're getting a template, or if we need to
    // load the template - and be sure to cache the result.
    var fn = !/\W/.test(str) ?
      cache[str] = cache[str] ||
        tmpl(document.getElementById(str).innerHTML) :

      // Generate a reusable function that will serve as a template
      // generator (and which will be cached).
      new Function("obj",
        "var p=[],print=function(){p.push.apply(p,arguments);};" +

        // Introduce the data as local variables using with(){}
        "with(obj){p.push('" +

        // Convert the template into pure JavaScript
        str
          .replace(/[\r\t\n]/g, " ")
          .split("<%").join("\t")
          .replace(/((^|%>)[^\t]*)'/g, "$1\r")
          .replace(/\t=(.*?)%>/g, "',$1,'")
          .split("\t").join("');")
          .split("%>").join("p.push('")
          .split("\r").join("\\'")
      + "');}return p.join('');");

    // Provide some basic currying to the user
    return data ? fn( data ) : fn;
  };
})();

Таким образом, ваш шаблон будет в разметке:

<script type="text/html" id="item_tmpl">
  <div id="<%=id%>" class="<%=(i % 2 == 1 ? " even" : "")%>">
    <div class="grid_1 alpha right">
      <img class="righted" src="<%=profile_image_url%>"/>
    </div>
    <div class="grid_6 omega contents">
      <p><b><a href="/<%=from_user%>"><%=from_user%></a>:</b> <%=text%></p>
    </div>
  </div>
</script>

Чтобы использовать его:

var results = document.getElementById("results");
results.innerHTML = tmpl("item_tmpl", dataObject);

Чтобы быть понятным -Приведенный выше пример взят из поста блога и является , а не моим кодом .Для получения дополнительной информации перейдите по ссылке.

1 голос
/ 20 августа 2010

Как уже упоминалось в других ответах, вам нужен язык шаблонов на основе JavaScript. В этом связанном вопросе есть довольно хороший список. Просто чтобы выделить пару, усы - это чисто, просто и портировано на многие языки. Я верю, что он используется Твиттером. Google Closure имеет язык шаблонов , который работает как на JavaScript, так и на Java. Это было проверено в битве Google, очевидно.

Другие основные библиотеки JS имеют шаблоны как плагины или часть библиотеки. Я знаю, что у jQuery есть по крайней мере один плагин, и он планирует его на дорожной карте для v1.5. У Dojo есть клон шаблонного языка Django , который выглядит довольно хорошо.

Есть и другие, но я думаю, что это будут сливки урожая.

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

0 голосов
/ 19 августа 2010

Вы можете использовать jQuery и какой-нибудь плагин jQuery для шаблонов.Например http://ivorycity.com/blog/jquery-template-plugin/ (посмотрите на эту страницу, есть несколько хороших примеров)

...