Створення багаторядкових рядків у JavaScript


2610

У мене в Ruby є такий код. Я хочу перетворити цей код у JavaScript. який еквівалентний код у JS?

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


Перевірте це на різних способах досягнення того ж. Я також додав продуктивність кожного методу stackoverflow.com/a/23867090/848841
Vignesh Subramanian

Відповіді:


3315

Оновлення:

ECMAScript 6 (ES6) вводить новий тип літералу, а саме літералі шаблону . Вони мають багато особливостей, змінну інтерполяцію серед інших, але найголовніше для цього питання вони можуть бути багатолінійними.

Буквал шаблону розмежовано за допомогою зворотних посилань :

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

(Примітка. Я не виступаю за використання HTML в рядках)

Підтримка веб-переглядача нормально , але ви можете використовувати транспілятори, щоб бути більш сумісними.


Оригінальна відповідь ES5:

У JavaScript немає синтаксису тут-документа. Однак ви можете уникнути буквального нового рядка, який наближається:

"foo \
bar"

231
Будьте попереджені: деякі веб-переглядачі будуть вставляти нові рядки на продовження, деякі - ні.
staticsan

35
Visual Studio 2010, здається, також плутає цей синтаксис.
jcollum

47
@Nate Він вказаний у розділі 7.8.4 5-го видання ECMA-262 і називається LineContinuation : "Символ термінатора рядка не може з'являтися в рядковому літералі, за винятком як частини LineContinuation для створення порожньої послідовності символів. Правильний спосіб викликати Символ рядкового термінатора, який повинен бути частиною значення String рядкового літералу, полягає у використанні послідовності відведення, наприклад \ n або \ u000A. "
десь

16
Я не бачу, чому ви робите це, коли браузери ставляться до цього непослідовно. "line1 \ n" + "line2" в декількох рядках читається досить, і вам гарантується послідовна поведінка.
SamStephens

11
"Підтримка браузера в порядку" ... не підтримується IE11 - не в порядку
Том Андрашек

1317

Оновлення 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.';

19
Я не розумію рекомендації Google. Усі веб-переглядачі, крім надзвичайно старих, підтримують зворотну косу рису, яка слідує за підходом нового рядка, і надалі це робитиме в майбутньому для зворотної сумісності. Єдиний раз, коли вам потрібно буде цього уникати, якщо вам потрібно було впевнитись, що в кінці кожного рядка додано один і лише один новий рядок (або жоден новий рядок) (див. Також мій коментар до прийнятої відповіді).
Метт Браун

6
Зауважте, що рядки шаблонів не підтримуються в IE11, Firefox 31, Chrome 35 або Safari 7. Див. Kangax.github.io/compat-table/es6
EricP

29
@MattBrowne Рекомендація Google вже задокументована за важливістю причин: (1) Пробіл на початку кожного рядка [у прикладі, ви не хочете, щоб цей пробіл у вашому рядку, але він виглядає приємніше в коді ] (2) пробіл після косої риски призведе до складних помилок [якщо ви закінчите рядок \ замість `\` важко помітити] та (3), хоча більшість двигунів сценаріїв підтримують це, це не є частиною ECMAScript [тобто чому використання нестандартних функцій?] Пам'ятайте, що це посібник зі стилів, який полягає у тому, щоб зробити код легким для читання + підтримка + налагодження: не просто правильно "він працює".
ShreevatsaR

1
дивно, що після всіх цих років конкатенація струн все ще є найкращим / найбезпечнішим / найвигіднішим способом вирішити це. Буквене позначення шаблону (вище відповідь) не працює в IE, а рятувальні рядки - це просто безлад, про який ви незабаром пошкодуєте
Tiago Duarte

1
З'ясували важкий спосіб, коли старіші версії Android не підтримують задні посилання, тож якщо у вас є додаток для Android, що використовує webView, ваші задні посилання спричиняють запуск вашого додатка!
Майкл лихоманка

684

візерунок 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 Примітка: це буде втрачено після мінімізації / оскарження вашого коду


34
Будь ласка, не використовуйте шаблон масиву. У більшості випадків це буде повільніше, ніж звичайне старе рядування.
BMiner

73
Шаблон масиву є більш читабельним, а втрата продуктивності для програми часто незначна. Як показує цей тест на парф, навіть IE7 може робити десятки тисяч операцій в секунду.
Бенджамін Аткін

19
+1 - елегантна альтернатива, яка не тільки працює однаково у всіх браузерах, але також є надійною для майбутнього.
Павло

26
@KooiInc Ваші тести починаються з уже створеного масиву, який перекриває результати. Якщо додати ініціалізацію масиву, пряма конкатенація швидше jsperf.com/string-concat-without-sringbuilder/7 Див stackoverflow.com/questions/51185 / ... Як трюк для перенесення рядків, це може бути добре, але це, безумовно , робити більше роботи, ніж слід
Хуан Мендес

9
@BMiner: 1) "Передчасна оптимізація - корінь усього зла" - Дональд Кнут, і 2) "читабельність" є в очах глядача
Пол Беннетт

348

Ви можете мати багаторядкові рядки в чистому 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
  • Опера 9.50 - 12 (не в 9-)
  • Сафарі 4 - 6 (не в 3-)
  • Хром 1 - 45
  • Firefox 17 - 21 ( не в 16- )
  • Rekonq 0.7.0 - 0.8.0
  • Не підтримується в Konqueror 4.7.4

Але будьте обережні зі своїм мініфікатором. Він, як правило, видаляє коментарі. Для компресора YUI коментар, що починається з /*!(як той, який я використав), буде збережений.

Я думаю, що справжнім рішенням було б використання CoffeeScript .

ОНОВЛЕННЯ ES6: Ви можете використовувати backtick замість створення функції з коментарем та запуску доString на коментарі. Регекс потрібно буде оновити лише до пробілів. Для цього також може бути метод рядкового прототипу:

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

Це було б круто. Хтось повинен написати цей .removeIndentation метод рядка ...;)


232
Що!? створення та декомпіляція функції, щоб зламати багаторядковий коментар як багаторядковий рядок? Тепер це некрасиво.
fforw

4
jsfiddle.net/fqpwf працює в Chrome 13 та IE8 / 9, але не у FF6. Я ненавиджу це говорити, але мені це подобається, і якщо це може бути цілеспрямована функція кожного браузера (щоб він не зник), я би використовував його.
Джейсон Клебан

2
@ uosɐſ: щоб це було навмисно, воно повинно бути в специфікації; або настільки широко використовується, що виробники браузерів не хочуть видаляти цю "випадкову" функцію. Дякую за експерименти, хоча ... Спробуйте якийсь кофескрипт.
Йордао

1
a.toString (). substring (15, a.toString (). length-4) також працює, і не потрібно сканувати всю рядок (хоча це, швидше за все, буде і підрахунок робить все-таки іншим сканування). .)
Lodewijk

2
Надзвичайно зручно. Я використовую його для тестів (Жасмін), але уникаю його для виробничого коду.
Джейсон

207

Ви можете це зробити ...

var string = 'This is\n' +
'a multiline\n' + 
'string';

Перший приклад чудовий і простий. Набагато краще, ніж \ підхід, оскільки я не впевнений, як веб-переглядач поводитиметься із зворотною косою рисою як символ втечі та як багаторядковий символ.
Метт К


e4x.js було б гарним рішенням у майбутньому
Пол Sweatte

139

Я придумав цей дуже джіммі сфальсифікований метод багаторядкової струни. Оскільки перетворення функції в рядок також повертає будь-які коментарі всередині функції, ви можете використовувати коментарі як рядок за допомогою багатомовного коментаря / ** /. Вам просто потрібно обрізати кінці і у вас є струна.

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)

37
Це абсолютно жахливо. Мені це подобається (хоча, можливо, вам доведеться провести матч з регулярними виразками, тому що я не впевнений, наскільки точним є пробіл toString().
Кевін Кокс,

Це рішення, здається, не працює у firefox, можливо, це захисна функція для браузера? EDIT: Nevermind, він не працює лише для Firefox версії 16.
Білл Програмний інженер

45
Також остерігайтеся міні-фіпер, які знімають коментарі ...: D
jondavidjohn

3
Ось чому ми не можемо мати приємних речей.
Данило М. Олівейра

4
Ви можете робити якісь дивні речі в javascript land. Хоча чесно, ніколи не слід цим користуватися.
Лука

88

Я здивований, що цього не бачив, оскільки він працює скрізь, де я його перевірив, і дуже корисний, наприклад, для шаблонів:

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

Хтось знає про середовище, де є HTML, але він не працює?


23
Де б ви не хотіли вставляти свої рядки в окремі та віддалені елементи сценарію.
Lodewijk

9
Дійсне заперечення! Це не ідеально. Але для шаблонів це розділення не лише нормально, але, можливо, навіть заохочується.
Пітер В. Морч

1
Я вважаю за краще розділяти все понад 80/120 символів на багаторядкові, боюся, це більше, ніж просто шаблони. Зараз я віддаю перевагу синтаксису 'line1' + 'line2'. Це також найшвидший (хоча це може бути суперником для дійсно великих текстів). Хоча це приємний трюк.
Lodewijk

27
насправді це HTML не Javascript: - /
CpILL

5
однак завдання отримати багаторядковий рядок у javascript можна виконати таким чином
Davi Fiamenghi

52

Я вирішив це, випустивши div, зробивши його прихованим і зателефонувавши до ідентифікатора div jQuery, коли мені це було потрібно.

напр

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

Тоді, коли мені потрібно отримати рядок, я просто використовую такий jQuery:

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

Що повертає мій текст у декількох рядках. Якщо я зателефоную

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

Я отримав:

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


2
Дякую за це! Це єдина відповідь, яку я знайшов, і вирішує мою проблему, яка включає невідомі рядки, які можуть містити будь-яку комбінацію одинарних і подвійних лапок, що безпосередньо вставляються в код, без можливості попереднього кодування. (мова йде про мову-шаблону, яка створює JS - все-таки з надійного джерела, а не з подання форми, тому це НЕ ВІДПОМОЧЕНО).
жовтня

Це єдиний метод, який фактично працював для мене, щоб створити багато рядкову струнну змінну javascript з Java String.
початківець_

4
Що робити, якщо рядок - HTML?
Дан Даскалеску

4
$ ('# UniqueID'). Content ()
mplungjan

1
@Pacerier Все, що я читав, як від Google, так і з інших сайтів, говорить про те, що в даний час Google робить індексування display:noneконтенту, швидше за все, завдяки популярності фронтальних версій стилів JavaScript. (Наприклад, сторінка поширених запитань із функцією приховування / показу.) Однак ви повинні бути обережними, оскільки Google каже, що вони можуть покарати вас, якщо прихований вміст здається штучним завищення ваших рейтингів SEO.
Гевін

31

Існує кілька способів досягти цього

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('');

Виконання продуктивності, Slash об'єднання (перша) є найшвидшим.

Детальнішу інформацію щодо продуктивності див. У цьому тестовому випадку

Оновлення:

За допомогою ES2015 ми можемо скористатися його функцією рядків шаблонів. З його допомогою нам просто потрібно використовувати зворотні тики для створення багаторядкових рядків

Приклад:

 `<h1>{{title}}</h1>
  <h2>{{hero.name}} details!</h2>
  <div><label>id: </label>{{hero.id}}</div>
  <div><label>name: </label>{{hero.name}}</div>
  `

11
Я думаю, це те, що ти вже п'ять років відрегулював те, що вже є на сторінці, але більш чистим способом.
RandomInsano

чи не буде конкатенація косою рисою також включати пробіл на початку рядків?
f.khantsis

29

Використання тегів сценарію:

  • додати <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>

Я думаю, що ця стратегія є чистою та значно використаною. jsrender використовує це.
xdhmoore

Я використовую це з innerText iso innerHTML, але як я можу переконатися, що пробіли збереглися?
Девід Ноулз

Також запити ajax у випадку, якщо ви їх використовуєте. Ви можете спробувати змінити заголовки, xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");я не пам’ятаю, щоб були інші проблеми, ніж помилки коментарів у JS. Місця, де немає проблем.
jpfreire

24

Мені подобається цей синтаксис і відступ:

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

(але насправді не можна розглядати як багаторядковий рядок)


3
Я використовую це, за винятком випадків, коли я ставлю "+" в кінці попереднього рядка, щоб зрозуміти, що твердження продовжується в наступному рядку. Хоча ваш спосіб вирівняє відступи більш рівномірно.
Шон

@Sean я також використовую це, і я все ще вважаю за краще поставити "+" на початку кожного нового доданого рядка та остаточного ";" на новому рядку, тому що я вважав це більш "правильним".
AgelessEssence

7
ставлення + на початку дозволяє коментувати цей рядок, не редагуючи інші рядки, коли це перший / останній рядок послідовності.
моліад

3
Я також вважаю за краще + спереду, оскільки візуально мені не потрібно сканувати до кінця рядка, щоб знати, що наступне - це продовження.
Данило Соколовський

18

Є ця бібліотека, яка робить її красивою:

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>
*/});

1
Ця підтримка в nodejsвикористанні в браузері повинна бути обережною.
Huei Tan

3
@HueiTan Docs State, він також працює в браузері. Що має сенс - це просто Function.prototype.String().
mikemaccana

ya, але він сказав: "Хоча він працює добре в браузері, він, головним чином, призначений для використання в Node.js. Використовуйте на свій страх і ризик. на власний ризик ». (Просто обережно XD)
Huei Tan

@HueiTanYep Я прочитав цю частину. Але Function.prototype.toString () досить стабільний і добре відомий.
mikemaccana

1
Найкраща відповідь для мене, тому що вона, принаймні, досягає багатолінійного без всякого сміття посередині (Сміття на початку та в кінці, з яким я можу мати справу).
Деміен Голдінг

14

Корота : Цей код надається лише для інформації.

Це було перевірено на Fx 19 та Chrome 24 на Mac

DEMO

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>


13
Це жахливо. +1. І ви можете використовувати document.currentScript замість getElement ...
Орвелофіл

1
Не визначене "ти" в хромі для osx
mplungjan

1
jsfiddle-fix - Я, мабуть, визначив "ти" глобально в моїй консолі. Працює зараз (chrome / osx). Приємно в тому, що додавати коментар до var, це те, що ти не перебуваєш у контексті функції, jsfiddle-function-heredoc, хоча функція може бути класною для класових методів. може бути краще передати йому заміну {this: that} об'єкт в будь-якому випадку. приємно підштовхнути щось божевільне до межі все-таки :)
Orwellophile

1
Забудьте про ненависників. Це єдиний правильний рядок відповідей ES6. Всі інші відповіді потребують конкатенації, обчислення чи виходу. Це насправді дуже круто, і я буду використовувати це як спосіб додати документацію до гри, над якою я працюю як хобі. Поки цей трюк не використовується для нічого, що може викликати помилку (я можу побачити, як хтось піде "Точка з комою, дербіть. Давайте помістіть коментар у наступний рядок", а потім він порушить ваш код.) Але, це що справді велика справа в моїй грі в хобі? Ні, і я можу використати крутий трюк для чогось корисного. Чудова відповідь.
Томас Дігнан

2
Я ніколи не був досить сміливим, щоб використовувати цю техніку у виробничому коді, але там, де я її дуже багато використовую, є тестування одиниць, де часто найпростіше скинути значення якоїсь структури як (досить довгий) рядок і порівняти її з що це повинно бути.
Бен Макінтайр

10

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

Тому я рекомендую працюючий підхід для користувачів JS користувача Opera. На відміну від того, що говорив автор:

Це не працює на Firefox або Opera; тільки на IE, хром і сафарі.

Він працює в Opera 11. Принаймні в сценаріях користувачів JS. Шкода, що я не можу коментувати індивідуальні відповіді чи підтверджувати відповідь, я б це зробив негайно. Якщо можливо, хтось із вищими привілеями, будь ласка, зробіть це для мене.


Це мій перший фактичний коментар. Я отримав привілей на відновлення 2 дні тому, тому я негайно відмовився від однієї відповіді, яку я згадав вище. Дякую всім, хто зробив підтримку моєї слабкої спроби допомогти.
Тайлер

Дякую всім, хто насправді підтримав цю відповідь: у мене зараз достатньо привілеїв, щоб публікувати звичайні коментарі! Тож ще раз дякую.
Тайлер

10

Моє розширення на 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();

9

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

Requ.js: 'вимагати текст'.

Використовуючи плагін "text" requ.js з багаторівневим шаблоном у template.html

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

NPM / перегляньте: модуль 'brfs'

Browrify використовує модуль 'brfs' для завантаження текстових файлів. Це фактично вбудує ваш шаблон у ваш пакетний HTML.

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

Легко.


9

Якщо ви готові скористатися новими рядками, що вийшли, їх можна буде використовувати чудово . Він схожий на документ із рамкою сторінки .

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


2
Чи не додали б це порожні пробіли?
tomByrer

1
@tomByrer Так, добре спостереження. Це добре лише для рядків, які не хвилюються пробілом, наприклад, HTML.
seo


8

Це працює в 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>

6
Просто подумайте. Ви вважаєте, що це дійсно? Ви не думаєте, що це може спричинити проблеми з дисплеєм?
Sk8erPeter

5
Чому голоси? Це творча відповідь, якщо не дуже практична!
dotancohen

2
ні це не так. Слід скоріше використовувати шаблони: $ .tmpl () ( api.jquery.com/tmpl ) або EJS ( embeddedjs.com/getting_started.html ) тощо. Однією з причин погіршення голосу є те, що він дійсно далекий від дійсного коду та використання це може спричинити величезні проблеми з дисплеєм.
Sk8erPeter

Я сподіваюся, що ніхто ніколи не використовує цю відповідь на практиці, але це акуратна ідея
DCShannon

7

Ви можете використовувати 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


Будь-яка документація щодо обмеження iPad / Safari? MDN, здається, вважає, що це все добре - developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Campbeln

@Campbeln: CoWorker сказав мені це (він використовував код). Я не перевіряв його сам. Можливо, це також залежить від версії iPad / Safari - так, ймовірно, залежить.
Стефан Штайгер

6

Спосіб ES6 зробити це можна за допомогою літеральних шаблонів:

const str = `This 

is 

a

multiline text`; 

console.log(str);

Більше довідки тут


Ця відповідь має не лише малий, неповний та неправильний формат, але також не додає абсолютно нічого до попередніх відповідей. Позначення його та перескакування для видалення.
Віктор Шредер

5

ES6 дозволяє використовувати зворотний зв'язок, щоб вказати рядок у кількох рядках. Це називається літеральний шаблон. Подобається це:

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

Використання backtick працює в NodeJS, і його підтримують Chrome, Firefox, Edge, Safari та Opera.

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


4

Найпростіший спосіб зробити багаторядкові рядки в Javascrips - це використання задників (``). Це дозволяє створити багаторядкові рядки, в які можна вставити змінні ${variableName}.

Приклад:

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

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

my age is: ${age}
`;

console.log(multilineString);

сумісність:

  • Це було введено в ES6//es2015
  • Зараз він підтримується всіма основними постачальниками браузерів (крім Internet Explorer)

Перевірте точну сумісність у документах Mozilla тут


Це тепер сумісне з усіма останніми браузерами? Або є деякі браузери, які все ще не підтримують цей синтаксис?
cmpreshn

Вибачте за мій надзвичайно пізній коментар, відредагував відповідь, додав інформацію про сумісність;)
Willem van der Veen

3

Моя версія з'єднання на основі масиву для рядка concat:

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 не використовують Array.push ()? )

Переглянувши ці (протилежні) тестові пробіги, схоже, що .push () чудово підходить для рядкових масивів, які, швидше за все, не перевищуватимуть 100 елементів - я уникаю цього на користь індексованих додавань для більших масивів.


3

Ви можете використовувати +=для об'єднання рядків, схоже, ніхто не відповів, що буде читабельним, а також акуратним ... щось подібне

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

можна також записати як

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

console.log(hello);

3

Також зауважте, що при розширенні рядка по декількох рядках із застосуванням прямої косої риски в кінці кожного рядка будь-які додаткові символи (переважно пробіли, вкладки та коментарі, додані помилково) після зворотної косої риски спричинить несподівану помилку символу, на що мені знадобилася година, щоб знайти з

var string = "line1\  // comment, space or tabs here raise error
line2";

3

Будь ласка, з любов'ю до Інтернету використовуйте конкатенацію рядків і не рекомендуйте використовувати для цього рішення ES6. ES6 НЕ підтримується в усьому світі, як і CSS3, а деякі браузери повільно адаптуються до руху CSS3. Використовуйте звичайний JavaScript, ваші кінцеві користувачі будуть вам вдячні.

Приклад:

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


3
хоча я погоджуюся з вашою думкою, я б не називав javascript "good" ol
user151496

2

Ви повинні використовувати оператор конкатенації '+'.

<!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вашого вихідного коду буде виглядати так:

Це 
 <br> є
 <br> багаторядковий
 <br> рядок.

За допомогою <br>браузера вихід буде виглядати так:

Це
є
багаторядковий
рядок.

1

Я думаю, що це рішення має працювати в 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>

Ура !!


<xmp>настільки застаріла. Це може бути дозволено в HTML, але його не повинні використовувати жодні автори. Дивіться stackoverflow.com/questions/8307846/…
Бергі

@Bergi, ти маєш рацію .. і використовуючи <pre>;втечі, не допоможемо в моєму вирішенні .. Я натрапив на подібну проблему сьогодні і намагаюся розібратися у вирішенні проблеми ... але в моєму випадку я знайшов один дуже n00bish спосіб вирішити цю проблему розміщення результатів у коментарях html замість <xmp> або будь-якого іншого тегу. Лол. Я знаю, що це не стандартний спосіб зробити це, але я буду працювати над цим питанням завтра вранці .. Привіт !!
Aditya Hajare

На жаль, навіть із style="display:none"Chrome намагаються завантажити будь-які <img>зображення, згадані в прикладі блоку.
Джессі Глік

0

Просто спробував відповідь "Анонімний" і виявив, що тут є невелика хитрість, вона не спрацьовує, якщо після зворотної косої риби є пробіл. \
Отже, наступне рішення не працює -

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);​

Сподіваюся, це допомагає !!


7
добре, очевидно, якщо у вас є пробіл після зворотної косої риси, зворотний косий рядок залишає пробіл. Передбачається уникнути розриву лінії, а не космосу.
Сеянус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.