Створення багаторядкових рядків у 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.