JavaScript многострочных строк и шаблонов? - PullRequest
2 голосов
/ 06 января 2011

Мне было интересно, есть ли способ определить многострочные строки в JavaScript, как вы можете сделать в таких языках, как PHP:

var str = "here
goes
another
line";

Очевидно, это разбивает синтаксический анализатор. Я обнаружил, что размещение обратной косой черты \ перед переводом строки решает проблему:

var str = "here\
goes\
another\
line";

Или я мог бы просто закрыть и снова открыть строковые кавычки снова и снова.

Причина, по которой я спрашиваю, потому что я делаю виджеты пользовательского интерфейса на основе JavaScript, которые используют шаблоны HTML, написанные на JavaScript. Больно вводить HTML в строках, особенно если вам нужно постоянно открывать и закрывать кавычки. Что было бы хорошим способом определения шаблонов HTML в JavaScript?

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

Ответы [ 5 ]

1 голос
/ 22 января 2012

@ slebetman, спасибо за подробный пример.Быстрый комментарий к функции substitute_strings.Я должен был изменить

 str.replace(n,substitutions[n]);

, чтобы он стал

 str = str.replace(n,substitutions[n]);

, чтобы заставить его работать.(jQuery версии 1.5? - это чистый javascript, хотя.)

Также, когда в моем шаблоне была следующая ситуация:

$CONTENT$ repeated twice $CONTENT$ like this

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

 str = str.replace(new RegExp(n, 'g'), substitutions[n]);

И мне пришлось воздержаться от $ (регулярное выражение специального символа) в качестве разделителя и использовать вместо него #.Думаю, я поделюсь своими выводами.

1 голос
/ 06 января 2011

Нет, это в основном то, что вы должны делать, чтобы создавать многострочные строки.

Но зачем определять шаблоны в javascript? почему бы просто не поместить их в файл и заставить ajax-вызов загрузить их в переменную, когда они вам нужны?

Для мгновенного использования (с помощью jquery)

$.get('/path/to/template.html', function(data) {
  alert(data); //will alert the template code
});
0 голосов
/ 08 января 2011

Вы также можете использовать \ n для создания новых строк.HTML, однако, будет в одной строке и трудно редактировать.Но если вы генерируете JS, используя PHP или что-то еще, это может быть альтернативой

0 голосов
/ 08 января 2011

Я думаю, что нашел решение, которое мне нравится.

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

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

0 голосов
/ 06 января 2011

В javascript есть несколько систем шаблонов. Однако, мой личный фаворит - тот, который я разработал сам, используя ajax для получения шаблонов XML. Шаблоны представляют собой файлы XML, что позволяет легко встраивать HTML-код и выглядит примерно так:

<title>This is optional</title>
<body><![CDATA[
    HTML content goes here, the CDATA block prevents XML errors
    when using non-xhtml html.

    <div id="more">
      $CONTENT$ may be substituted using replace() before being
      inserted into $DOCUMENT$.
    </div>
]]></body>
<script><![CDATA[
    /* javascript code to be evaled after template
     * is inserted into document. This is to get around
     * the fact that this templating system does not
     * have its own turing complete programming language.
     * Here's an example use:
     */
     if ($HIDE_MORE$) {
       document.getElementById('more').display = 'none';
     }
]]></script>

И код JavaScript для обработки шаблона выглядит примерно так:

function insertTemplate (url_to_template, insertion_point, substitutions) {
  // Ajax call depends on the library you're using, this is my own style:
  ajax(url_to_template, function (request) {
    var xml = request.responseXML;
    var title = xml.getElementsByTagName('title');
    if (title) {
      insertion_point.innerHTML += substitute_strings(title[0],substitutions);
    }
    var body = xml.getElementsByTagName('body');
    if (body) {
      insertion_point.innerHTML += substitute_strings(body[0],substitutions);
    }
    var script = xml.getElementsByTagName('script');
    if (script) {
      eval(substitute_strings(script[0],substitutions));
    }
  });
}

function substitute_strings (str, substitutions) {
  for (var n in substitutions) {
    str.replace(n,substitutions[n]);
  }
  return str;
}

Способ вызова шаблона:

insertTemplate('http://path.to.my.template', myDiv, {
  '$CONTENT$' : "The template's content",
  '$DOCUMENT$' : "the document",
  '$HIDE_MORE$' : 0
});

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

Одним большим преимуществом использования замен на стороне javascript вместо обработки шаблона на стороне сервера является то, что это позволяет шаблону быть простыми статическими файлами. Преимущество этого (за исключением того, что нет необходимости писать код на стороне сервера) заключается в том, что вы можете установить политику кэширования для шаблона как очень агрессивную, так что браузеру нужно будет только извлечь шаблон при первой загрузке. Последующее использование шаблона будет происходить из кэша и будет очень быстрым.

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

Мне действительно нравится эта причина в том, что HTML - это просто HTML в текстовом файле. Это позволяет избежать кавычек и ужасных проблем с производительностью конкатенации строк, которые вы обычно обнаружите, если напрямую встраиваете строки HTML в javascript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...