Создание многострочных строк в JavaScript

У меня есть следующий код на Ruby. Я хочу преобразовать этот код в JavaScript. Каков эквивалентный код в JS?

text = <<"HERE"
This
Is
A
Multiline
String
HERE

person Newy    schedule 30.04.2009    source источник


Ответы (39)


Обновлять:

ECMAScript 6 (ES6) представляет новый тип литерала, а именно литералы шаблона. У них много функций, среди прочего, переменная интерполяция, но, что наиболее важно в этом вопросе, они могут быть многострочными.

Литерал шаблона отделяется обратными кавычками:

var html = `
  <div>
    <span>Some HTML here</span>
  </div>
`;

(Примечание: я не рекомендую использовать HTML в строках)

Поддержка браузера в порядке, но вы можете использовать transpilers для большей совместимости.


Исходный ответ ES5:

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

"foo \
bar"
person Anonymous    schedule 30.04.2009
comment
Visual Studio 2010, похоже, тоже сбивает с толку этот синтаксис. - person staticsan; 30.04.2009
comment
@Nate Он указан в ECMA-262 5-е издание раздел 7.8.4 и называется LineContinuation: символ конца строки не может появляться в строковом литерале, кроме как как часть LineContinuation для создания пустой последовательности символов. Правильный способ сделать символ конца строки частью значения String строкового литерала - использовать escape-последовательность, такую ​​как \ n или \ u000A. - person jcollum; 18.04.2011
comment
Подводя итог, кажется, что это наиболее простой подход, совместимый со всеми браузерами, по крайней мере, до IE6 (и, возможно, ранее), если вам все равно, могут ли добавляться дополнительные символы новой строки в конце каждой строки. Кто-нибудь знает, какие браузеры / версии добавляют новые строки, а какие нет? - person some; 25.09.2012
comment
Также: если вы используете UglifyJS для минификации, он поместит созданные таким образом многострочные строки в одну строку ( символы новой строки не будут добавлены при продолжении). Итак, пока браузер, в котором вы разрабатываете, ведет себя одинаково, вы можете использовать этот подход и получать согласованные результаты во всех браузерах в производственной версии вашего приложения (т.е. после минификации). - person Matt Browne; 26.02.2013
comment
Я не понимаю, зачем вы это делаете, если браузеры трактуют это непоследовательно. line1 \ n + line2 на нескольких строках достаточно читаем, и вам гарантировано последовательное поведение. - person Matt Browne; 26.02.2013
comment
_1_: работает; требует явных _2_ символов. для вставки фактических разрывов строк (согласно спецификации ECMAScript 5). Другими словами: если вы хотите, чтобы каждая строка исходного кода строкового литерала соответствовала строке в результирующей строке, завершайте строки символом \ n \ - person SamStephens; 21.03.2013
comment
Этот синтаксис идеально подходит для машин, которые никогда случайно не поставят пробел между обратной косой чертой и новой строкой. Всем остальным придется вставить свой код в редактор комментариев SO, чтобы увидеть выделенную разницу между node 0.10.0 и \ - person mklement0; 25.03.2013
comment
@some Это не многострочная строка, это однострочная строка, разделенная на несколько строк кода, составляющих один оператор - person Zev Spitz; 11.10.2013
comment
@JuanMendes Да? Так говорится в первом предложении цитаты из стандарта. Так в чем ваша точка зрения? Предложение секунд формально сообщает, как создать строку с признаками конца строки, которая в исходном коде разбита на несколько строк. Я не помню, что написал Нейт в теперь удаленном комментарии, но я думаю, что это было связано с тем, что он не является частью javascript. Я сослался на стандарт, где он определен, и процитировал соответствующую часть. - person Juan Mendes; 05.09.2014
comment
@some Я хочу сказать, что вопрос запрашивает многострочную строку, поэтому это не отвечает на вопрос. Может путаница только из-за удаленного комментария, который я никогда не видел - person some; 06.09.2014
comment
@JuanMendes И я не пытался ответить на этот вопрос, потому что уже было много других ответов. Дрезенде уже прокомментировал это неправильно, это не многострочный. Это всего лишь 1 строка, поэтому мне не пришлось ее повторять. Я предоставил информацию о LineContinuation только в комментарии, поэтому я был немного удивлен, когда вы написали свой комментарий мне, а не Anonymous, который ответил на вопрос! :) В ECMAScript 5.1 и ранее запрошенный синтаксис не поддерживается. Ближайшая вещь - это новая экранированная строка, за которой следует LineContinuation, но, на мой взгляд, это некрасиво. - person Juan Mendes; 06.09.2014
comment
В этом решении нет ничего плохого, но явно не лучшего. Так грустно, что здесь так много счета. Прокрутите вниз, чтобы ознакомиться с лучшими решениями. - person some; 07.09.2014
comment
AFAIK, IE до сих пор не поддерживает его - person Zane; 26.10.2014
comment
Большое спасибо человеку, предоставившему этот ответ. - person IcedDante; 27.07.2016
comment
Поддержка браузера в порядке ... не поддерживается IE11 - не в порядке - person ; 24.05.2017
comment
Я тестировал шаблонный литерал на safari 7.1 Mavericks, у меня не работает. - person Tom Andraszek; 25.05.2017
comment
Браузерная поддержка на самом деле НЕ в порядке. IE выдает ошибку недопустимого символа для этого символа. Я не понимаю, как он получил столько голосов ... - person Rishabh Agrahari; 14.09.2017
comment
Это не для IE - person sotn; 25.12.2017
comment
Добавлен бонус .. вам не нужно экранировать кавычки, поэтому строковый json выглядит разумно: _1_ - person César León; 29.12.2017
comment
Это тот ответ, который заставляет меня ТАК ЛЮБИТЬ. - person Avner; 02.08.2018
comment
ВНИМАНИЕ: не поддерживается IE. :( - person Iharob Al Asimi; 04.11.2018
comment
Обратите внимание, что простой способ работать с отступами, не добавляя дополнительных строк вверху и внизу строки html в примере, - это вызвать для нее _1_. - person RayLoveless; 31.10.2019
comment
это не работает для меня в canary chrome для Windows даже после включения экспериментального JavaScript - person Oliver Sieweke; 16.11.2020

Обновление ES6:

Как упоминается в первом ответе, с ES6 / Babel теперь вы можете создавать многострочные строки, просто используя обратные кавычки:

const htmlString = `Say hello to 
multi-line
strings!`;

Интерполяция переменных - это популярная новая функция, в которой используются строки, разделенные обратным тиком:

const htmlString = `${user.name} liked your post about strings`;

Это просто сводится к конкатенации:

user.name + ' liked your post about strings'

Исходный ответ ES5:

Руководство по стилю JavaScript от Google рекомендует использовать конкатенацию строк вместо экранирования новой строки. :

Не делайте этого:

var myString = 'A rather long string of English text, an error message \
                actually that just keeps going and going -- an error \
                message to make the Energizer bunny blush (right through \
                those Schwarzenegger shades)! Where was I? Oh yes, \
                you\'ve got an error and all the extraneous whitespace is \
                just gravy.  Have a nice day.';

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

Вместо этого используйте конкатенацию строк:

var myString = 'A rather long string of English text, an error message ' +
               'actually that just keeps going and going -- an error ' +
               'message to make the Energizer bunny blush (right through ' +
               'those Schwarzenegger shades)! Where was I? Oh yes, ' +
               'you\'ve got an error and all the extraneous whitespace is ' +
               'just gravy.  Have a nice day.';
person Devin Rhode    schedule 06.06.2011
comment
Я не понимаю рекомендации Google. Все браузеры, за исключением очень старых, поддерживают обратную косую черту, за которой следует подход новой строки, и будут продолжать делать это в будущем для обеспечения обратной совместимости. Единственный раз, когда вам нужно избегать этого, - это если вам нужно быть уверенным, что одна и только одна новая строка (или не новая строка) была добавлена ​​в конец каждой строки (см. Также мой комментарий к принятому ответу). - person Inuart; 20.11.2012
comment
Тем, кто хочет попробовать эти возможности, обязательно проверьте [Chrome Canary] [1] [1]: google.com/intl/en/chrome/browser/canary.html - person Matt Browne; 26.02.2013
comment
Обратите внимание, что строки шаблонов не поддерживаются в IE11, Firefox 31, Chrome 35 или Safari 7. См. kangax.github.io/compat-table/es6 - person Sazid; 31.10.2013
comment
_1_ _2_ Согласен. Я пробовал это при написании пользовательского скрипта Chrome, и он не работал ни в одной новой или старой версии Chromium или Chrome, которую я пробовал; все они выдали _3_ ошибки. Думаю, как обычно, Google хочет настаивать на том, чтобы люди делали что-то по-своему. - person EricP; 24.05.2014
comment
@MattBrowne Рекомендации Google уже задокументированы ими в порядке важности причин: (1) Пробел в начале каждой строки [в примере, вы не хотите, чтобы этот пробел в вашей строке, но он выглядит лучше в коде ] (2) пробел после косой черты приведет к сложным ошибкам [если вы закончите строку In EcmaScript 6, you'll be able to use backticks for Template Strings, known in the spec as a NoSubstitutionTemplate. I think you can try this and other features by first downloading canary chrome and then turning on Enable Experimental JavaScript. вместо `\`, это трудно заметить] и (3) хотя большинство скриптовых движков поддерживают это, это не является частью ECMAScript [т.е. зачем использовать нестандартные функции?] Помните, что это руководство по стилю, которое касается облегчения чтения кода + поддержки + отладки: а не просто правильной работы. - person Synetech; 01.06.2014
comment
удивительно, что после стольких лет конкатенация строк по-прежнему остается лучшим / безопасным / наиболее совместимым способом решения этой проблемы. литералы шаблонов (ответ выше) не работают в IE, а экранирование строк - это просто беспорядок, о котором вы скоро пожалеете - person ShreevatsaR; 31.07.2016
comment
Скажем так, я запрашиваю веб-службу, которая выдает данные для отображения на странице HTML, я пишу переменные JS для хранения HTML и передачи в них значений. как _1_. Будет ли это плохой подход? - person Tiago Duarte; 11.11.2016
comment
Обратите внимание, что если у вас очень длинная строка конкатенации строк, это может вызвать переполнение стека (github.com/cmdcolin/ Technical_oddities) - person techie_28; 17.07.2018
comment
На собственном опыте выяснилось, что более старые версии Android не поддерживают обратные кавычки, поэтому, если у вас есть приложение для Android, использующее webView, ваши обратные кавычки заставляют ваше приложение не запускаться! - person Colin D; 26.12.2018
comment
Пожалуйста, не используйте шаблон массива. В большинстве случаев это будет медленнее, чем обычная конкатенация строк. - person Michael Fever; 26.06.2019

шаблон text = <<"HERE" This Is A Multiline String HERE недоступен в js (я помню, как часто использовал его в старые добрые времена Perl).

Чтобы контролировать сложные или длинные многострочные строки, я иногда использую шаблон массива:

var myString = 
   ['<div id="someId">',
    'some content<br />',
    '<a href="#someRef">someRefTxt</a>',
    '</div>'
   ].join('\n');

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

    var myString = 
       '<div id="someId"> \
some content<br /> \
<a href="#someRef">someRefTxt</a> \
</div>';

Вот еще один странный, но работающий трюк 1:

var myString = (function () {/*
   <div id="someId">
     some content<br />
     <a href="#someRef">someRefTxt</a>
    </div>        
*/}).toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1];

внешнее редактирование: jsfiddle

ES20xx поддерживает объединение строк в несколько строк с помощью шаблонных строк :

let str = `This is a text
    with multiple lines.
    Escapes are interpreted,
    \n is a newline.`;
let str = String.raw`This is a text
    with multiple lines.
    Escapes are not interpreted,
    \n is not a newline.`;

1 Примечание: это будет потеряно после уменьшения / запутывания вашего кода.

person KooiInc    schedule 30.04.2009
comment
в большинстве случаев ... вы также включили время, необходимое для выделения / построения массива? Несмотря на это ... это немного более читабельно, чем объединение массивов. - person BMiner; 17.07.2011
comment
Шаблон массива более читабелен, а потеря производительности приложения часто незначительна. Как показывает этот тест производительности, даже IE7 может выполнять десятки тысяч операций в секунду. - person BMiner; 18.07.2011
comment
@Kooilnc: некоторые браузеры могут скомпилировать несколько буквальных конкатенаций в одну буквальную строку, причем в машинном коде, не меньше. В тесте также следовало бы попробовать большое объединение строковых переменных, что было бы более справедливым сравнением с join (). - person Benjamin Atkin; 20.08.2011
comment
@RoyTinker: не стесняйтесь готовить jsperf.com-тест для себя или возиться с моим тестом;) - person Roy Tinker; 11.10.2011
comment
Это мой любимый способ (выглядит красиво), и достаточно быстрый, чтобы я хотел немного снизить скорость для читабельности кода. - person KooiInc; 19.10.2011
comment
Вы можете создать небольшую функцию для быстрого соединения: function fastjoin (array) {out = ''; for (i в массиве) {out + = i; } вернуться; } - person RobKohr; 22.11.2011
comment
На самом деле это намного медленнее, чем у этих соединений. Кроме того, соединения - это своего рода предпочтительный способ сделать это. Присоединяется. - person Lodewijk; 09.01.2012
comment
Мне нравится присоединяться. Напишите код, который записывает код. Намного лучше, чем многократное сцепление. Это избыточность. - person Lodewijk; 09.01.2012
comment
+1 за элегантную альтернативу, которая не только одинаково работает во всех браузерах, но и рассчитана на будущее. - person Rimian; 14.05.2012
comment
Должен заключаться в «синглы», а НЕ двойники для меня в Блокноте ++ - person Pavel; 21.05.2012
comment
Лично я просто объединяю строки и позволяю решать проблемы с производительностью, когда JS минимизируется, а строки объединяются. - person Cody; 10.01.2013
comment
@BMiner: 1) Преждевременная оптимизация - корень всех зол, - Дональд Кнут, и 2) читаемость - в глазах смотрящего. - person Juan Mendes; 04.08.2013
comment
@bat При тестировании на Mac 10.9 с Firefox 32 соединение было на 100% медленнее, чем конкатенация, согласно jsperf (972 миллиона против 1 миллиона операций в секунду). - person Paul Bennett; 25.03.2014
comment
Будьте осторожны с комментарием в решении функции. Имейте в виду, что как только вы захотите минимизировать свой JS-код, ваши комментарии будут удалены. - person Chris Middleton; 03.10.2014
comment
+1 за потрясающий _1_ трюк. Работает как шарм, и мне это нравится. У меня все еще есть проблема с экранированием символов _2_ в строках _3_, но это не нужно. Я делаю это только для тестирования на основе файлов. Спасибо чувак! - person Jerska; 17.11.2014
comment
Протестировано на Win 8.1 в Firefox и Chrome, соединение выполняется на 33% медленнее, чем объединение. - person WebWanderer; 23.01.2015
comment
Протестировано на Win 8.1 в Chrome и Firefox, присоединение у меня на 99% медленнее. (1,997,886,948 против 18,679,979 соответственно 2,161,096,056 против 2,145,283) - person nevelis; 08.05.2015
comment
Если это не находится глубоко внутри миллиона вложенных циклов и не выполняется на картофеле, эффективность, вероятно, не имеет значения рядом с удобочитаемостью. +1 для массива - person Florian Wendelborn; 27.05.2015
comment
Существует ›150 версий теста jsPerf. Я не проверял даже большое их количество. Версия 25 проверяет конкатенацию строк и _1_ как для предопределенных, так и для встроенных массивов. Конкатенация строк примерно в от 500 до 1000 раз быстрее, чем у Array _2_, на основе тестирования в текущих версиях Chrome и Firefox 19 февраля 2017 года. Конкатенация строк может быть записана с аналогичным уровнем читаемости. На мой взгляд, нет никакого эффективного преимущества использования _3_ для этого, и значительная стоимость просто крутого выбора стиля. - person Wolfie Inu; 27.10.2015
comment
Почему конкатенация строк намного быстрее, чем соединение? Есть ли какая-то магия в реализации соединения? - person Makyen♦; 20.02.2017
comment
@zehelvion больше нет. Это очень старая проблема (2009 г.), браузеры сейчас намного лучше - person AturSams; 12.04.2017
comment
@KooiInc, А как насчет конкатенации внутри многострочной строки? - person KooiInc; 12.04.2017
comment
@Seblor, почему бы и нет? Подзаголовок не был информативным. - person Pacerier; 09.07.2017
comment
AFAIK, строки шаблонов (или литералы шаблонов) не поддерживались до ES2015 (ES6), поэтому утверждение, что любая версия ES20XX действительно кажется неправильным. - person KooiInc; 24.08.2018
comment
@Seblor см. explorejs.com/es6/ch_template-literals.html, а также explorejs.com/es6/ch_faq.html#sec_es6-vs-es2015 - person Seblor; 24.08.2018
comment
О, я понял, что это замешательство. Версии ECMAScript стали называться ES20XX в честь ES6, я забыл об этом. - person KooiInc; 24.08.2018
comment
Мне нравится массивный подход. Конечно, это может быть медленнее, но, как правило, важнее правильность и удобочитаемость. Я видел причину не использовать его в браузере, но это был бы хороший подход с серверным javascript. Кроме того, теперь у нас есть строковые шаблоны с обратной кавычкой (`), которые стали еще лучше. - person Seblor; 24.08.2018
comment
Пример с совпадением регулярного выражения содержит переменную в дополнительном выражении / ** /. Это может вызвать проблемы, если вы решите сжать JS позже. Многие компрессоры удаляют комментарии! - person luis.espinal; 22.10.2018
comment
Этот метод использования комментария в виде строки ужасает! Интересно, но я подозреваю, что это нарушает почти все руководства по стилю и базовый этикет программирования! Надеюсь, никто не использует его в реальном мире, но это определенно интересно! - person Tomas Šivickas; 27.11.2019
comment
Игнорирование скептиков, стонущих по поводу производительности, ударил по трюку с массивом, на самом деле действительно элегантное решение. Большое спасибо за то, что разместили это. Здесь есть настоящее нестандартное мышление! - person Patrick L; 30.11.2019
comment
Какие!? создание и декомпиляция функции для преобразования многострочного комментария в многострочную строку? Теперь это уродливо. - person Hybrid web dev; 09.06.2020

Вы можете иметь многострочные строки в чистом JavaScript.

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

Используя следующую функцию:

function hereDoc(f) {
  return f.toString().
      replace(/^[^\/]+\/\*!?/, '').
      replace(/\*\/[^\/]+$/, '');
}

У вас могут быть вот такие документы:

var tennysonQuote = hereDoc(function() {/*!
  Theirs not to make reply,
  Theirs not to reason why,
  Theirs but to do and die
*/});

Метод успешно протестирован в следующих браузерах (не упоминается = не тестировалось):

  • IE 4 - 10
  • Opera 9.50 - 12 (нет в 9-)
  • Safari 4-6 (не в 3-)
  • Хром 1–45
  • Firefox 17–21 (отсутствует в 16-)
  • Реконк 0,7,0 - 0,8,0
  • Не поддерживается в Konqueror 4.7.4

Однако будьте осторожны со своим минификатором. Имеет тенденцию удалять комментарии. Для компрессора YUI комментарий, начинающийся с /*! (например, тот, который я использовал), будет сохранен.

Я думаю, что реальным решением было бы использовать CoffeeScript.

ОБНОВЛЕНИЕ ES6: вы можете использовать обратную кавычку вместо создания функции с комментарием и запуска toString для комментария. Регулярное выражение необходимо будет обновить только для удаления пробелов. У вас также может быть метод строкового прототипа для этого:

let foo = `
  bar loves cake
  baz loves beer
  beer loves people
`.removeIndentation()

Кто-то должен написать этот строковый метод .removeIndentation ...;)

person Jordão    schedule 06.04.2011
comment
jsfiddle.net/fqpwf работает в Chrome 13 и IE8 / 9, но не в FF6. Ненавижу это говорить, но мне это нравится, и если бы это могло быть преднамеренной функцией каждого браузера (чтобы она не исчезла), я бы ее использовал. - person fforw; 17.06.2011
comment
У меня была надежда на работу. toSource () для FF, но нет. - person Jason Kleban; 10.09.2011
comment
@ uosɐſ: чтобы это было намеренно, это должно быть в спецификации; или настолько широко используются, что производители браузеров не захотят удалять эту случайную функцию. Хотя спасибо за эксперименты ... Попробуйте кофе-скрипт. - person Jason Kleban; 10.09.2011
comment
@BrockAdams: спасибо за информацию; именно поэтому такой подход является ненадежным взломом. - person Jordão; 10.09.2011
comment
a.toString (). substring (15, a.toString (). length-4) также работает, и ему не нужно сканировать всю строку (хотя, скорее всего, это будет, и подсчет все равно сделает это еще одно сканирование. .) - person Jordão; 25.12.2011
comment
Очень удобно. Я использую его для модульных тестов (Jasmine), но избегаю его для производственного кода. - person Lodewijk; 09.01.2012
comment
@ Джейсон: Я не знаю, хорошая ли это идея, даже для тестирования. Ваша тестовая среда также может развиться и отказаться от этой случайной функции. Пожалуйста, подумайте еще раз. Этот пост предназначен только для развлекательных целей .... - person Jason; 13.07.2012
comment
My Heredoc работает в моем Fx и Chrome на Mac: DEMO - person Jordão; 13.07.2012
comment
Вы только что упростили для меня добавление огромных блоков HTML в мои тесты QUnit! Сейчас я создаю объект StaticStrings в своем тестовом классе, который содержит несколько таких строк. - person mplungjan; 17.02.2013
comment
Это не удалось, когда у меня в комментариях есть буквально ‹/script›. - person Rhyous; 24.02.2014
comment
Синтаксис становится уродливым, когда вам нужно передать переменные внутри длинного многострочного текста. Или вам придется заменять струны несколько раз. - person Korjavin Ivan; 16.04.2014
comment
Еще проще _1_ - person Eugene Mala; 24.10.2015
comment
@fforw, на самом деле это довольно изящно, хотя бы его реализация независима. - person Prakash GPz; 26.11.2016
comment
Для этого вам не нужно регулярное выражение: _1_ - person Pacerier; 17.06.2017
comment
@JamesWilkins: действительно, нет. Фактически, вам даже не следует использовать это решение в первую очередь. - person James Wilkins; 15.10.2017
comment
Я знаю, просто сделаю ответ более полным для новых людей, которые его найдут. ;) - person Jordão; 16.10.2017
comment
До сих пор не встречалось случая, когда это не работало бы должным образом в серверных приложениях, от узла 0.0.10 до 10.0.0. Хотя без регулярного выражения, но с использованием от _1_ до _2_ и операции подстроки. Это также замечательно, поскольку с этим подходом вы можете предварительно скомпилировать текстовые блоки из _3_ файлов в кеш при запуске приложения. - person James Wilkins; 16.10.2017
comment
@hajikelist: вам действительно следует использовать строки шаблона к настоящему времени (узел ›= 4.0.0). - person hajikelist; 23.05.2019
comment
@ Jordão - ну, конечно, я использую строки шаблонов везде, где это возможно. Их можно использовать с настраиваемыми сценариями mysql [конечно, для операторов подготовки], содержащих множество обратных кавычек. Я все еще не думаю, что этот подход так плох, как некоторые из этих чрезмерно драматических ответов. Это работало буквально везде, где мне приходилось пробовать это последние 7 или 8 лет. Ваше здоровье. - person Jordão; 24.05.2019
comment
@ Jordão Что касается метода _1_, как насчет _2_ - person hajikelist; 26.05.2019
comment
@fforw просто для упрощения до одной строки .removeIndentation() - person foobored; 22.04.2020
comment
Первый пример отличный и простой. Намного лучше, чем подход \, поскольку я не уверен, как браузер будет обрабатывать обратную косую черту как escape-символ и как многострочный символ. - person bluejayke; 04.06.2020

Ты можешь сделать это...

var string = 'This is\n' +
'a multiline\n' + 
'string';
person Community    schedule 30.04.2009
comment
comment
e4x.js - хорошее перспективное решение. - person Brock Adams; 22.11.2012
comment
Это просто ужасно. Мне это нравится (хотя вам может потребоваться сопоставление регулярных выражений, потому что я не уверен, насколько точны пробелы для _1_. - person Paul Sweatte; 19.01.2013

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

var myString = function(){/*
    This is some
    awesome multi-lined
    string using a comment 
    inside a function 
    returned as a string.
    Enjoy the jimmy rigged code.
*/}.toString().slice(14,-3)

alert(myString)
person Luke    schedule 21.03.2013
comment
Это решение, похоже, не работает в firefox, может быть, это функция безопасности для браузера? РЕДАКТИРОВАТЬ: Неважно, это не работает только для Firefox версии 16. - person Kevin Cox; 08.04.2013
comment
Также остерегайтесь минификаторов, которые удаляют комментарии ...: D - person Bill Software Engineer; 06.06.2013
comment
@KevinCox, ты можешь использовать _1_. - person jondavidjohn; 22.10.2013
comment
@JosuaSchmid Это будет обрабатывать только пробелы до и после, Он не будет обрабатывать такие вещи, как trim(). Но этого может хватить. - person schmijos; 17.10.2014
comment
@KevinCox Это правда. Поскольку я использую coffeescript, получается комбинация: function ( ) { ... - person Kevin Cox; 18.10.2014
comment
Почему в срез передаются параметры 14 и -3? - person schmijos; 20.10.2014
comment
@MnemonicFlow Просто скопируйте и вставьте код из ответа до _1_ в консоли вашего браузера и посмотрите, что он вернет. - person Alex Bitek; 10.06.2016
comment
Вот почему у нас не может быть хороших вещей. - person Sebastian Simon; 16.08.2016
comment
Вы можете делать странные вещи в мире javascript. Хотя, честно говоря, вы никогда не должны этим пользоваться. - person Danilo M. Oliveira; 15.10.2018
comment
Везде, где вы не хотите помещать свои строки в отдельные и удаленные элементы скрипта. - person Luke; 26.10.2018

Я удивлен, что не увидел этого, потому что он работает везде, где я его тестировал, и очень полезен, например, для шаблоны:

<script type="bogus" id="multi">
    My
    multiline
    string
</script>
<script>
    alert($('#multi').html());
</script>

Кто-нибудь знает среду, в которой есть HTML, но он не работает?

person Peter V. Mørch    schedule 03.01.2012
comment
Уместное возражение! Это не идеально. Но для шаблонов такое разделение не только нормально, но, возможно, даже поощряется. - person Lodewijk; 09.01.2012
comment
Я предпочитаю разбивать все, что превышает 80/120 символов, на несколько строк, боюсь, что это больше, чем просто шаблоны. Теперь я предпочитаю синтаксис 'line1' + 'line2'. Он также самый быстрый (хотя может соперничать с ним для действительно больших текстов). Хотя это хороший трюк. - person Peter V. Mørch; 03.02.2012
comment
на самом деле это HTML, а не Javascript: - / - person Lodewijk; 04.02.2012
comment
однако задача получения многострочной строки в javascript может быть выполнена таким образом - person CpILL; 22.05.2012
comment
@Peter, вы также можете сделать запрос AJAX для текстового файла с символами новой строки в нем. - person Davi Fiamenghi; 31.07.2013
comment
Но что происходит, когда кто-то использует минификатор JavaScript? - person Juan Mendes; 04.08.2013
comment
Я не думаю, например webpack всегда будет смотреть на теги _1_, встроенные в HTML. - person wp-overwatch.com; 20.06.2018
comment
Люблю это решение. Очень чистый. - person Peter V. Mørch; 24.06.2018
comment
Спасибо за это! Это единственный найденный мной ответ, который решает мою проблему, которая связана с неизвестными строками, которые могут содержать любую комбинацию одинарных и двойных кавычек, которые напрямую вставляются в код без возможности предварительного кодирования. (он исходит из языка шаблонов, который создает JS - все еще из надежного источника, а не из формы, поэтому он НЕ СОВЕРШЕННО безумный). - person Ryan Marshall; 29.11.2018

Я решил это, выведя div, сделав его скрытым и вызвав id div с помощью jQuery, когда мне это нужно.

e.g.

<div id="UniqueID" style="display:none;">
     Strings
     On
     Multiple
     Lines
     Here
</div>

Затем, когда мне нужно получить строку, я просто использую следующий jQuery:

$('#UniqueID').html();

Что возвращает мой текст на нескольких строках. Если я позвоню

alert($('#UniqueID').html());

Я получил:

введите описание изображения здесь

person Tom Beech    schedule 17.08.2012
comment
Это был единственный метод, который действительно работал у меня для создания многострочной строковой переменной javascript из строки Java. - person octern; 23.06.2013
comment
это выполняет работу за меня, хотя не решает присвоение многострочных строковых значений переменным javascript - person beginner_; 06.08.2013
comment
Что, если строка - это HTML? - person Venkat; 23.09.2013
comment
$ ('# Уникальный идентификатор'). Content () - person Dan Dascalescu; 24.01.2014
comment
@TomBeech, Интересная идея, но есть ограничение: в нее нельзя поместить переменную. Единственная временная мера - сделать уродливый поиск и замену. - person mplungjan; 24.01.2014
comment
Просто имейте в виду, что поисковые системы по-прежнему индексируют контент в скрытых DIV. - person Pacerier; 09.07.2017
comment
@ Гэвин, ты уверен в этом? Тем более, что мы уже установили _1_? - person Gavin; 17.07.2017
comment
@Pacerier Все, что я читал от Google, а также с других сайтов, говорит о том, что в настоящее время Google индексирует display:none контент, скорее всего, из-за популярности интерфейсов в стиле JavaScript. (Например, страница часто задаваемых вопросов с функцией скрытия / отображения.) Вы должны быть осторожны, потому что Google заявляет, что они могут наказать вас, если скрытый контент будет создан для искусственного завышения вашего SEO-рейтинга. - person Pacerier; 07.08.2017
comment
Я думаю, это то, что вы просто извергли то, что уже было на странице в течение пяти лет, но более чистым способом. - person Gavin; 08.08.2017

Есть несколько способов добиться этого

1. Конкатенация косой черты

  var MultiLine=  '1\
    2\
    3\
    4\
    5\
    6\
    7\
    8\
    9';

2. обычная конкатенация

var MultiLine = '1'
+'2'
+'3'
+'4'
+'5';

3. Объединение массивов

var MultiLine = [
'1',
'2',
'3',
'4',
'5'
].join('');

С точки зрения производительности, конкатенация косой черты (первая) является самой быстрой.

См. этот тестовый пример для получения дополнительных сведений о производительности.

Обновление:

В ES2015 мы можем воспользоваться его функцией шаблонных строк. С его помощью нам просто нужно использовать обратные тики для создания многострочных строк.

Пример:

 `<h1>{{title}}</h1>
  <h2>{{hero.name}} details!</h2>
  <div><label>id: </label>{{hero.id}}</div>
  <div><label>name: </label>{{hero.name}}</div>
  `
person Vignesh Subramanian    schedule 26.05.2014
comment
не будет ли конкатенация косой черты также включать пробелы в начале строк? - person RandomInsano; 02.08.2014
comment
Я думаю, что эта стратегия чиста и мало используется. jsrender использует это. - person f.khantsis; 10.05.2017

Используя теги скрипта:

  • добавьте блок <script>...</script>, содержащий ваш многострочный текст, в тег head;
  • получить многострочный текст как есть ... (обратите внимание на кодировку текста: UTF-8, ASCII)

    <script>
    
        // pure javascript
        var text = document.getElementById("mySoapMessage").innerHTML ;
    
        // using JQuery's document ready for safety
        $(document).ready(function() {
    
            var text = $("#mySoapMessage").html(); 
    
        });
    
    </script>
    
    <script id="mySoapMessage" type="text/plain">
    
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:typ="...">
           <soapenv:Header/>
           <soapenv:Body>
              <typ:getConvocadosElement>
                 ...
              </typ:getConvocadosElement>
           </soapenv:Body>
        </soapenv:Envelope>
    
        <!-- this comment will be present on your string -->
        //uh-oh, javascript comments...  SOAP request will fail 
    
    
    </script>
    
person jpfreire    schedule 23.08.2012
comment
Я использую это с innerText iso innerHTML, но как мне убедиться, что пробелы сохранены? - person xdhmoore; 09.01.2015
comment
Также запросы ajax, если вы их используете. Вы можете попробовать изменить свои заголовки _1_ Я не помню, чтобы у меня были другие проблемы, кроме опечаток в комментариях в JS. Пространства, где нет проблем. - person David Nouls; 16.07.2015
comment
Я использую это, за исключением того, что ставлю знак «+» в конце предыдущей строки, чтобы было ясно, что оператор продолжается в следующей строке. Тем не менее, ваш способ выравнивает отступы более равномерно. - person jpfreire; 28.10.2015

Мне нравится этот синтаксис и отступы:

string = 'my long string...\n'
       + 'continue here\n'
       + 'and here.';

(но на самом деле не может рассматриваться как многострочная строка)

person semente    schedule 13.12.2011
comment
@Sean, я тоже использую это, и я все еще предпочитаю ставить '+' в начале каждой новой добавленной строки и заключительный ';' на новой строке, потому что я нашел его более «правильным». - person Sean; 04.10.2012
comment
размещение + в начале позволяет закомментировать эту строку без необходимости редактировать другие строки, когда это первая / последняя строка последовательности. - person AgelessEssence; 14.11.2013
comment
Я предпочитаю + спереди, так как визуально мне не нужно сканировать до конца строки, чтобы знать, что следующая будет продолжением. - person moliad; 12.12.2013
comment
Эта поддержка в _1_, при использовании в браузере должна быть осторожна. - person Daniel Sokolowski; 07.05.2014

Вот эта библиотека, которая делает его красивым:

https://github.com/sindresorhus/multiline

До

var str = '' +
'<!doctype html>' +
'<html>' +
'   <body>' +
'       <h1>❤ unicorns</h1>' +
'   </body>' +
'</html>' +
'';

После

var str = multiline(function(){/*
<!doctype html>
<html>
    <body>
        <h1>❤ unicorns</h1>
    </body>
</html>
*/});
person mightyiam    schedule 25.04.2014
comment
@HueiTan Docs заявляет, что он также работает в браузере. Что имеет смысл - это просто nodejs. - person Huei Tan; 05.05.2014
comment
да, но он сказал. Хотя он отлично работает в браузере, он в основном предназначен для использования в Node.js. Используйте на свой страх и риск. Хотя он отлично работает в браузере, он в основном предназначен для использования в Node.js. Используйте на свой риск. (Просто будьте осторожны, XD) - person mikemaccana; 13.07.2014
comment
@HueiTanYep Я читал эту часть. Но Function.prototype.toString () довольно стабильна и хорошо известна. - person Huei Tan; 14.07.2014
comment
Лучший ответ для меня, потому что он, по крайней мере, обеспечивает многострочность без всего мусора в середине (мусора в начале и в конце, с которым я могу справиться). - person mikemaccana; 14.07.2014
comment
Это ужасно. +1. И вы можете использовать document.currentScript вместо getElement ... - person Damien Golding; 27.08.2014

Голосующие против: этот код предоставляется только для информации.

Это было протестировано в Fx 19 и Chrome 24 на Mac.

ДЕМО

var new_comment; /*<<<EOF 
    <li class="photobooth-comment">
       <span class="username">
          <a href="#">You</a>:
       </span>
       <span class="comment-text">
          $text
       </span> 
       @<span class="comment-time">
          2d
       </span> ago
    </li>
EOF*/
// note the script tag here is hardcoded as the FIRST tag 
new_comment=document.currentScript.innerHTML.split("EOF")[1]; 
document.querySelector("ul").innerHTML=new_comment.replace('$text','This is a dynamically created text');
<ul></ul>

person mplungjan    schedule 17.02.2013
comment
currentScript? В каких браузерах? Моему ответу больше 2-х лет :) - person Orwellophile; 27.05.2015
comment
Но это был уникальный ответ. На самом деле я сейчас пишу полифилл, но в основном потому, что jsfiddle загружает ваш скрипт встроенным. Я хочу закодировать * интерполяцию –– (отказавшись от # {}, потому что ES7 определяет $ {this.var}. - person mplungjan; 27.05.2015
comment
jsfiddle Реализован с интерполяцией локальных переменных, неограниченное количество уникальных HEREDOC, метод, адаптированный для _1_ стиля HEREDOC, а также . Сокращенное использование: _2_ - person Orwellophile; 27.05.2015
comment
Undefined you in chrome для osx - person Orwellophile; 27.05.2015
comment
jsfiddle-fixed - должно быть, вы определили вас глобально в моей консоли. Сейчас работает (chrome / osx). Хорошая вещь в добавлении комментария к переменной заключается в том, что вы не находитесь в контексте функции, jsfiddle- function-heredoc, хотя для методов класса было бы здорово использовать функцию. в любом случае может быть лучше передать ему объект replace {this: that}. в любом случае весело довести что-то безумное до предела :) - person mplungjan; 27.05.2015
comment
Забудь ненавистников. Это единственная правильная панель ответов ES6. Все остальные ответы требуют конкатенации, какого-либо вычисления или экранирования. На самом деле это довольно круто, и я собираюсь использовать его как способ добавить документацию к игре, над которой я работаю в качестве хобби. Пока этот трюк не используется ни для чего, что может вызвать ошибку (я вижу, как кто-то переходит к точке с запятой, сумасшедший. Давайте поместим комментарий в следующую строку. А затем он сломает ваш код). Но так ли это на самом деле большое дело в моей хобби-игре? Нет, и я могу использовать этот крутой трюк для чего-нибудь полезного. Отличный ответ. - person Orwellophile; 01.06.2015
comment
Для меня по-прежнему отображается _1_ по всему тексту - Chrome / OSX. - person Thomas Dignan; 28.07.2015
comment
Я посмотрю, когда доберусь до iMac в конце этой недели - person Steve Bennett; 17.08.2015
comment
Я никогда не был достаточно храбрым, чтобы использовать эту технику в производственном коде, но я часто использую ее в модульном тестировании, где часто проще всего выгрузить значение какой-либо структуры в виде (довольно длинной) строки и сравнить ее с каким оно должно быть. - person mplungjan; 17.08.2015
comment
Просто подумай об этом. Как вы думаете, это действительно так? Вам не кажется, что это может вызвать проблемы с отображением? - person Ben McIntyre; 03.02.2016

Эквивалент в javascript:

var text = `
This
Is
A
Multiline
String
`;

Вот спецификация. См. Информацию о поддержке браузера внизу этой страницы. Вот несколько примеров.

person Lonnie Best    schedule 04.11.2015

Это работает в IE, Safari, Chrome и Firefox:

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
<div class="crazy_idea" thorn_in_my_side='<table  border="0">
                        <tr>
                            <td ><span class="mlayouttablecellsdynamic">PACKAGE price $65.00</span></td>
                        </tr>
                    </table>'></div>
<script type="text/javascript">
    alert($(".crazy_idea").attr("thorn_in_my_side"));
</script>
person stillatmycomputer    schedule 23.11.2010
comment
Почему отрицательные голоса? Это творческий ответ, если не сказать очень практичный! - person Sk8erPeter; 24.02.2012
comment
нет, это не так. Лучше использовать шаблоны: $ .tmpl () (api.jquery.com/tmpl), или EJS (embeddedjs.com/getting_started.html) и т. д. Одной из причин отрицательных голосов является то, что это действительно далекий от действительного кода, и его использование может вызвать огромные проблемы с отображением. - person dotancohen; 29.02.2012
comment
Надеюсь, никто никогда не использует этот ответ на практике, но это отличная идея - person Sk8erPeter; 24.03.2012
comment
Пограничный случай, когда у вас есть _1_ в html. в этом случае вам, возможно, придется использовать html-сущности _2_. - person DCShannon; 14.03.2015
comment
Это мой первый настоящий комментарий. Я получил право голоса 2 дня назад, поэтому я сразу же проголосовал за один ответ, упомянутый выше. Спасибо всем, кто поддержал мою слабую попытку помочь. - person borracciaBlu; 18.12.2020

Подводя итог, я попробовал 2 подхода, перечисленных здесь в пользовательском программировании javascript (Opera 11.01):

Поэтому я рекомендую рабочий подход пользователям Opera, использующим JS. В отличие от того, что говорил автор:

Не работает в Firefox или Opera; только в IE, Chrome и Safari.

Он ДЕЙСТВИТЕЛЬНО работает в Opera 11. По крайней мере, в пользовательских JS-скриптах. Жаль, что я не могу комментировать отдельные ответы или голосовать за ответ, я бы сделал это немедленно. Если возможно, кто-нибудь с более высокими привилегиями, пожалуйста, сделайте это за меня.

person Tyler    schedule 20.05.2011
comment
Спасибо всем, кто на самом деле проголосовал за этот ответ: теперь у меня достаточно прав, чтобы публиковать обычные комментарии! Так что еще раз спасибо. - person Tyler; 24.07.2011
comment
Разве это не добавило бы лишних пробелов? - person Tyler; 31.08.2012

Мое расширение для https://stackoverflow.com/a/15558082/80404. Он ожидает комментарий в виде /*! any multiline comment */, где символ! используется для предотвращения удаления путем минификации (по крайней мере, для компрессора YUI)

Function.prototype.extractComment = function() {
    var startComment = "/*!";
    var endComment = "*/";
    var str = this.toString();

    var start = str.indexOf(startComment);
    var end = str.lastIndexOf(endComment);

    return str.slice(start + startComment.length, -(str.length - end));
};

Пример:

var tmpl = function() { /*!
 <div class="navbar-collapse collapse">
    <ul class="nav navbar-nav">
    </ul>
 </div>
*/}.extractComment();
person pocheptsov    schedule 11.12.2013

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

require.js: 'требовать текст'.

Использование плагина require.js 'text' с многострочным шаблоном в template.html

var template = require('text!template.html')

NPM / browserify: модуль brfs

Browserify использует модуль brfs для загрузки текстовых файлов. Это фактически встроит ваш шаблон в ваш связанный HTML.

var fs = require("fs");
var template = fs.readFileSync(template.html', 'utf8');

Легкий.

person mikemaccana    schedule 10.02.2014

Если вы хотите использовать экранированные символы новой строки, их можно использовать красиво. Похоже на документ с рамкой страницы.

введите описание изображения здесь

person seo    schedule 28.04.2015
comment
@tomByrer Да, хорошее наблюдение. Это хорошо только для строк, которые вам не нужны пробелы, например HTML. - person tomByrer; 06.12.2015
comment
Этот ответ не только маленький, неполный и плохо отформатированный, но и ничего не добавляет к предыдущим ответам. Пометка и переход на удаление. - person seo; 07.12.2015

В ES6 это можно сделать с помощью шаблонных литералов:

const str = `This 

is 

a

multiline text`; 

console.log(str);

Дополнительная информация здесь

person jenil christo    schedule 13.07.2018
comment
Есть документация по ограничению iPad / Safari? Кажется, что в MDN все хорошо - разработчик . mozilla.org/en-US/docs/Web/JavaScript/Reference/ - person Victor Schröder; 18.01.2019

Вы можете использовать TypeScript (JavaScript SuperSet), он поддерживает многострочные строки и переносит обратно в чистый JavaScript без накладных расходов. :

var templates = {
    myString: `this is
a multiline
string` 
}

alert(templates.myString);

Если вы хотите добиться того же с помощью простого JavaScript:

var templates = 
{
 myString: function(){/*
    This is some
    awesome multi-lined
    string using a comment 
    inside a function 
    returned as a string.
    Enjoy the jimmy rigged code.
*/}.toString().slice(14,-3)

}
alert(templates.myString)

Обратите внимание, что iPad / Safari не поддерживает 'functionName.toString()'

Если у вас много устаревшего кода, вы также можете использовать простой вариант JavaScript в TypeScript (для очистки):

interface externTemplates
{
    myString:string;
}

declare var templates:externTemplates;

alert(templates.myString)

и вы можете использовать многострочный объект из простого варианта JavaScript, где вы помещаете шаблоны в другой файл (который вы можете объединить в пакет).

Вы можете попробовать TypeScript на
http://www.typescriptlang.org/Playground.

person Stefan Steiger    schedule 21.09.2015
comment
@Campbeln: CoWorker сказал мне это (он использовал код). Сам не тестировал. Может также зависеть от версии iPad / Safari - вероятно, зависит. - person Campbeln; 05.08.2017
comment
Теперь это совместимо со всеми последними браузерами? Или есть браузеры, которые до сих пор не поддерживают этот синтаксис? - person Stefan Steiger; 06.08.2017

Самый простой способ сделать многострочные строки в Javascrips - использовать обратные кавычки (``). Это позволяет вам создавать многострочные строки, в которые вы можете вставлять переменные с ${variableName}.

Пример:

let name = 'Willem'; 
let age = 26;

let multilineString = `
my name is: ${name}

my age is: ${age}
`;

console.log(multilineString);

совместимость:

  • Он был введен в _3 _ // _ 4_
  • Теперь он изначально поддерживается всеми основными поставщиками браузеров (кроме Internet Explorer).

Проверьте точную совместимость в документации Mozilla здесь

person Willem van der Veen    schedule 09.09.2018
comment
Извините за мой очень поздний комментарий, отредактировал ответ добавил информацию о совместимости;) - person cmpreshn; 28.09.2018
comment
пока я согласен с вашей точкой зрения, я бы не назвал javascript хорошим олд - person Willem van der Veen; 02.10.2018

ES6 позволяет использовать обратную кавычку для указания строки на нескольких строках. Это называется шаблонным литералом. Нравится:

var multilineString = `One line of text
    second line of text
    third line of text
    fourth line of text`;

Использование обратной кавычки работает в NodeJS и поддерживается Chrome, Firefox, Edge, Safari и Opera.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals

person earl3s    schedule 28.03.2016

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

var string = "line1\  // comment, space or tabs here raise error
line2";
person Prakash GPz    schedule 13.07.2016

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

Пример:

var str = "This world is neither flat nor round. "+ "Once was lost will be found";

person Pragmatiq    schedule 11.10.2017
comment
текст - это строка, почему json.stringify? - person user151496; 05.03.2018

Моя версия объединения на основе массивов для конкатенации строк:

var c = []; //c stands for content
c.push("<div id='thisDiv' style='left:10px'></div>");
c.push("<div onclick='showDo(\'something\');'></div>");
$(body).append(c.join('\n'));

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

Требуется ли много времени для добавления в массив .push ()? См. Соответствующий ответ:

(Есть ли причина, по которой разработчики JavaScript не используют массив? .push ()?)

Посмотрев на эти (противоположные) тестовые прогоны, похоже, что .push () подходит для строковых массивов, которые вряд ли вырастут более чем на 100 элементов - я буду избегать его в пользу индексированных добавлений для более крупных массивов.

person KTys    schedule 14.10.2013

Вы можете использовать += для объединения вашей строки, похоже, никто не ответил на это, что будет читабельно, а также аккуратно ... что-то вроде этого

var hello = 'hello' +
            'world' +
            'blah';

можно также записать как

var hello = 'hello';
    hello += ' world';
    hello += ' blah';

console.log(hello);
person Mr. Alien    schedule 18.01.2014

Вы должны использовать оператор конкатенации "+".

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <p id="demo"></p>
    <script>
        var str = "This "
                + "\n<br>is "
                + "\n<br>multiline "
                + "\n<br>string.";
        document.getElementById("demo").innerHTML = str;
     </script>
</body>
</html>

При использовании \n ваш исходный код будет выглядеть так:

This 
 <br>is
 <br>multiline
 <br>string.

При использовании <br> вывод вашего браузера будет выглядеть так:

This
is
multiline
string.
person Sonevol    schedule 13.08.2017

Точный

Ruby производит: "This\nIs\nA\nMultiline\nString\n" - ниже JS создает точно такую ​​же строку

text = `This
Is
A
Multiline
String
`

// TEST
console.log(JSON.stringify(text));
console.log(text);

Это улучшение Лонни Лучший ответ, потому что символы новой строки в его ответе не совсем те же позиции, что и в выводе ruby.

person Kamil Kiełczewski    schedule 10.06.2020
comment
@FlatLander это только для теста - чтобы увидеть, где именно символы новой строки _1_ (для сравнения с выходом ruby ​​(рабочий пример связан в ответе)) - это улучшение ответа Лонни, потому что символы новой строки в его ответе не совсем те же позиции, что и при выходе из рубина - person FlatLander; 12.07.2020
comment
\n устарел. Это может быть разрешено в HTML, но не должно использоваться никакими авторами. См. stackoverflow.com/questions/ 8307846 / - person Kamil Kiełczewski; 12.07.2020

Я думаю, что этот обходной путь должен работать в IE, Chrome, Firefox, Safari, Opera -

Использование jQuery:

<xmp id="unique_id" style="display:none;">
  Some plain text
  Both type of quotes :  " ' " And  ' " '
  JS Code : alert("Hello World");
  HTML Code : <div class="some_class"></div>
</xmp>
<script>
   alert($('#unique_id').html());
</script>

Использование чистого Javascript:

<xmp id="unique_id" style="display:none;">
  Some plain text
  Both type of quotes :  " ' " And  ' " '
  JS Code : alert("Hello World");
  HTML Code : <div class="some_class"></div>
</xmp>
<script>
   alert(document.getElementById('unique_id').innerHTML);
</script>

Ваше здоровье!!

person Aditya Hajare    schedule 28.01.2013
comment
@Bergi, вы правы ... и использование <xmp> с экранированием не поможет в моем решении ... Сегодня я столкнулся с подобной проблемой и пытался найти обходной путь ... но в моем случае я нашел один очень неловкий способ исправить эту проблему помещая вывод в html-комментарии вместо ‹xmp› или любого другого тега. ржу не могу. Я знаю, что это не стандартный способ сделать это, но я буду работать над этим вопросом завтра утром .. Ура !! - person Bergi; 28.01.2013
comment
К сожалению, даже с <pre>; Chrome пытается загрузить любые _2_ изображения, упомянутые в блоке примера. - person Aditya Hajare; 28.01.2013
comment
ну, очевидно, если у вас есть пробел после обратной косой черты, обратная косая черта ускользает от пробела. Предполагается, что он избегает разрыва строки, а не пробела. - person Jesse Glick; 09.12.2013

Вы можете использовать шаблоны с тегами, чтобы получить желаемый результат.

Например:

// Merging multiple whitespaces and trimming the output

const t = (strings) => { return strings.map((s) => s.replace(/\s+/g, ' ')).join("").trim() }
console.log(t`
  This
  Is
  A
  Multiline
  String
`);
// Output: 'This Is A Multiline String'

// Similar but keeping whitespaces:

const tW = (strings) => { return strings.map((s) => s.replace(/\s+/g, '\n')).join("").trim() }
console.log(tW`
  This
  Is
  A
  Multiline
  String
`);
// Output: 'This\nIs\nA\nMultiline\nString'
person Pedro Andrade    schedule 08.07.2020

Просто попробовал анонимный ответ и обнаружил, что здесь есть небольшая хитрость, он не работает, если после обратной косой черты есть пробел \
Итак, следующее решение не работает -

var x = { test:'<?xml version="1.0"?>\ <-- One space here
            <?mso-application progid="Excel.Sheet"?>' 
};

Но когда пространство удалено, это работает -

var x = { test:'<?xml version="1.0"?>\<-- No space here now
          <?mso-application progid="Excel.Sheet"?>' 
};

alert(x.test);​

Надеюсь, это поможет !!

person Anmol Saraf    schedule 23.11.2012
comment
это ужасно, есть причина, по которой люди НЕ программируют таким образом - person Sejanus; 14.12.2012

Я программирую так:

sys = {
    layout: null,
    makeLayout: function (obCLS) {
        this.layout = $('<div />').addClass('editor').appendTo($(obCLS)).append(

            /* Cargador */
            /* @this.layout.find('> div:nth-of-child(1)'); */
            '<div>' +
            '   <p>Seleccione la imagen que desea procesar.</p>' +
            '   <input type="button" value="Seleccionar" class="btn btn-xlarge btn-success" />' +
            '   <span></span>' +
            '</div>' +

            /* Cargador - Progreso */
            /* @this.layout.find('> div:nth-of-child(2)'); */
            '<div>' +
            '   <div>' +
            '       <div></div>' +
            '       <div>' +
            '           <div></div>' +
            '       </div>' +
            '   </div>' +
            '</div>' +

            /* Editor */
            /* @this.layout.find('> div:nth-of-child(3)');
             * @sidebar = this.layout.find('> div:nth-of-child(3) > div > div > div:nth-of-type(1)');
             * @body    = this.layout.find('> div:nth-of-child(3) > div > div > div:nth-of-type(2) > div'); */
            '<div>' +
            '   <div>' +
            '       <div>' +
            '           <div></div>' +
            '           <div>' +
            '               <div></div>' +
            '           </div>' +
            '       </div>' +
            '   </div>' +
            '</div>'
        );
    }
}

sys.makeLayout('#div');
person e-info128    schedule 02.08.2013
comment
Держите HTML там, где он должен быть. В HTML-документе. Скройте HTML и используйте jQuery, чтобы показать его, когда это необходимо. Намного чище и удобнее в обслуживании. - person Barry Chapman; 18.02.2014
comment
Да, я хочу извиниться, прошло 7 лет, и я больше не программирую таким образом, ясно, что код html должен быть в формате html или jsx, а не внутри кода javascript. - person Tek; 11.03.2014
comment
это работает: _1_ - person e-info128; 16.06.2020

Думаю, я нашел другой способ сделать это встроенным без какого-либо инвазивного синтаксиса в каждой строке. Используйте возможность Javascript для преобразования функции в строку и создания многострочного комментария с синтаксисом /**/, затем удалите «function () {/ * \ n» и «\ n * /}».

var multiline = function(string) { return string.toString().replace(/(^[^\n]*\n)|(\n\*\/\})/g, ""); };

console.log(multiline(function() {/*
Hello world!
I'm a multiline string!

Tada!
*/}));

Единственная ошибка, которую я вижу в этом, - это подсветка синтаксиса.

РЕДАКТИРОВАТЬ: если бы я прокрутил еще немного, я бы увидел, что этот ответ делает то же самое: https://stackoverflow.com/a/5571069/916553

person AdrianCooney    schedule 27.08.2013

Если вы работаете только в Node, вы можете использовать модуль fs для чтения многострочной строки из файла:

var diagram;
var fs = require('fs');
fs.readFile( __dirname + '/diagram.txt', function (err, data) {
  if (err) {
    throw err; 
  }
  diagram = data.toString();
});
person Charles Brandt    schedule 09.09.2014

Это довольно экономичный подход, по крайней мере, с точки зрения исходного кода:

function s() {
    var args = [],index;
    for (index = 0; index< arguments.length; index++) {
        args.push (arguments [index]);
    }
    return args.join ("\n");
}
console.log (s (
    "This is the first line",
    "and this is the second",
    "finally a third"
));

function s() {return arguments.join ("\n")} 

было бы, конечно, лучше, если бы свойство «arguments» было правильным массивом.

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

person Iain MacKay    schedule 07.03.2013
comment
Признаюсь, я делал это несколько раз, чтобы перенести сложные строки в кавычки в javascript, хотя я их заранее готовлю. Но вы ошибаетесь в том, что не можете использовать переменные javascript, вы можете реализовать интерполяции в стиле кофейного скрипта, которые выглядят как # {this.example}, и заменить регулярное выражение .replace на функцию закрытия . - person Jan; 13.09.2015

Правило: внутри строки используйте \ n везде, где хотите новую строку; вам не нужно ставить пробел до или после \ n, интерпретатор JavaScript достаточно умен, чтобы знать, как долго длится непечатаемое символьное представление.

person Sapphire_Brick    schedule 24.07.2019

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

этот код javascript должен оставаться внутри тегов скрипта.

var html=<?php echo json_encode("

        <div class=container>
            <div class=area1>
                xxx
            </div>
            <div class=area2>
                ".$someVar."
            </div>
        </div>

"); ?>

в своем выходном HTML вы увидите что-то вроде

var html="\r\n\r\n\t\t\t<div class=container>\r\n\t\t\t\t<div class=area1>\r\n\t\t\t\t\txxx\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=area2>\r\n\t\t\t\t\t44\r\n\t\t\t\t<\/div>\r\n\t\t\t<\/div>\r\n\r\n\t\t";  

и et voilà!, это обеспечивает читаемость кода в вашем файле.


pD: в этом примере используется функция PHP json_encode (), но, безусловно, существуют эквиваленты функций для языков ASP, Ruby и JSP.

pD: однако у этого решения тоже есть свои ограничения, одно из них - вы не можете использовать переменные javascript внутри инкапсулированного кода.

Это не очень элегантно, но для меня достаточно чистое:

person AgelessEssence    schedule 14.11.2013
comment
Вместо этого вы должны использовать _1_. НАМНОГО чище. - person Orwellophile; 27.05.2015

Будьте осторожны: некоторые браузеры будут вставлять новые строки при продолжении, некоторые нет.

var myString = "First line" + "\n";
var myString = myString + "Second line" + "\n";
var myString = myString + "Third line" + "\n";
person Community    schedule 19.02.2013
comment
На самом деле, вы должны использовать var myString += "Second line \n";. _2_ не следует повторять. - person Colin; 27.02.2013
comment
используйте + только для сцепления строк. Не нужно объявлять весь буфер для каждой строки. Это ужасно. - person Michael Mior; 11.07.2013
comment
Следует ли мне исправить свой ответ или оставить его как хороший пример того, как НЕ делать что-то? Если это лучше для тех, кто изучает JavaScript, я не против оставить его как есть сейчас. Несколько отрицательных моментов не могут так сильно повредить. - person e-info128; 02.08.2013
comment

- person BearCode; 26.11.2014