2011-01-06 3 views
2

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

var str = "here 
goes 
another 
line"; 

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

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

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

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

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

ответ

1

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

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

Для instantce (используя JQuery)

$.get('/path/to/template.html', function(data) { 
    alert(data); //will alert the template code 
}); 
+1

Поскольку для каждого шаблона требуется время, чтобы сделать XHR? Или у вас есть способы обойти это или другие предложения? – Tower

+0

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

+0

@rFactor: Смотрите мой ответ за то, как я обошел эту проблему. – slebetman

0

Есть несколько шаблонных систем в 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> 

И в яваскрипте код для обработки шаблона идет что-то вроде этого:

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.

0

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

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

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

0

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

1

@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]); 

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

Смежные вопросы