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

1981

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

text = <<"HERE"
This
Is
A
Multiline
String
HERE
Теги:
string
heredoc
multiline

36 ответов

2281
Лучший ответ

Обновить:

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

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

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

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

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


Оригинальный ответ ES5:

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

"foo \
bar"
  • 207
    Имейте в виду: некоторые браузеры будут вставлять символы новой строки, некоторые нет.
  • 31
    Visual Studio 2010, похоже, смущен и этим синтаксисом.
Показать ещё 27 комментариев
1194

Обновление 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 в JavaScript рекомендуется использовать конкатенацию строк вместо экранирования строк:

Не делай это:

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.';
  • 0
    это не работает для меня в Canary Chrome для Windows, даже после включения экспериментального JavaScript
  • 19
    Я не понимаю рекомендации Google. Все браузеры, кроме очень старых, поддерживают обратную косую черту с последующим подходом новой строки и будут продолжать делать это в будущем для обратной совместимости. Единственный раз, когда вам нужно этого избегать, это если вам нужно быть уверенным, что в конце каждой строки был добавлен только один и только один символ новой строки (или нет символа новой строки) (см. Также мой комментарий к принятому ответу).
Показать ещё 8 комментариев
668

шаблон 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');

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

    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 Примечание: это будет потеряно после сведения/обфускации кода

  • 30
    Пожалуйста, не используйте шаблон массива. В большинстве случаев это будет медленнее, чем обычная конкатенация строк.
  • 144
    В самом деле? jsperf.com/join-concat/24
Показать ещё 29 комментариев
313

Вы можете иметь многострочные строки в чистом 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 -)
  • Chrome 1 - 45
  • Firefox 17 - 21 (не в 16 -)
  • Rekonq 0.7.0 - 0.8.0
  • Не поддерживается в Konqueror 4.7.4

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

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

  • 23
    + 1 + 1 Умный! (работает в Node.JS)
  • 214
    Какие!? создать и декомпилировать функцию, чтобы взломать многострочный комментарий в многострочную строку? Теперь это безобразно.
Показать ещё 19 комментариев
177

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

var string = 'This is\n' +
'a multiline\n' + 
'string';
  • 0
    Первый пример отличный и простой. Намного лучше, чем \ подход, так как я не уверен, как браузер будет обрабатывать обратную косую черту как escape-символ и как многострочный символ.
  • 0
    Код CDATA (E4X) устарел и скоро перестанет работать даже в Firefox .
Показать ещё 1 комментарий
112

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

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)
  • 34
    Это абсолютно ужасно. Мне это нравится (хотя вам может потребоваться сопоставить регулярные выражения, потому что я не уверен, насколько точен пробел для toString() .
  • 7
    stackoverflow.com/a/5571069/499214
Показать ещё 9 комментариев
78

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

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

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

  • 23
    Везде, где вы не хотите помещать свои строки в отдельные и удаленные элементы скрипта.
  • 9
    Действительное возражение! Это не идеально. Но для шаблонов это разделение не только хорошо, но, возможно, даже поощряется.
Показать ещё 7 комментариев
46

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

например.

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

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

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

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

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

Я получаю:

Изображение 2066

  • 2
    Спасибо за это! Это единственный ответ, который я нашел, который решает мою проблему, которая включает в себя неизвестные строки, которые могут содержать любую комбинацию одинарных и двойных кавычек, которые вставляются непосредственно в код без возможности предварительного кодирования. (это исходит из языка шаблонов, который создает JS - все еще из надежного источника, а не отправки формы, так что это не ПОЛНОСТЬЮ безумно).
  • 0
    Это был единственный метод, который на самом деле работал для меня, чтобы создать многострочную строковую переменную javascript из строки Java.
Показать ещё 7 комментариев
27

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

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

    <script>
    
        // pure javascript
        var text = document.getElementById("mySoapMessage").innerHTML ;
    
        // using JQuery 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>
    
  • 0
    Я думаю, что эта стратегия является чистой и недостаточно используемой. JSrender использует это.
  • 0
    Я использую это с innerText iso innerHTML, но как мне убедиться, что пробелы сохраняются?
Показать ещё 2 комментария
26

Существует несколько способов достижения этого

1. Конкатенация слэш

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

2. регулярная конкатенация

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

3. Array Присоединиться к конкатенации

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

Производительность, Конкатенация слэш (первая) - самая быстрая.

Обратитесь этот тестовый пример для получения более подробной информации о производительности

Update:

С ES2015 мы можем воспользоваться функцией Template strings. При этом нам просто нужно использовать обратные тики для создания многострочных строк

Пример:

 `<h1>{{title}}</h1>
  <h2>{{hero.name}} details!</h2>
  <div><label>id: </label>{{hero.id}}</div>
  <div><label>name: </label>{{hero.name}}</div>
  `
  • 10
    Я думаю, это то, что вы только что отрыгнули то, что уже есть на странице в течение пяти лет, но более чистым способом.
  • 0
    не коснется ли конкатенация также пробелов в начале строк?
23

Мне нравится этот синтаксис и подзаголовок:

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

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

  • 3
    Я использую это, за исключением того, что я ставлю «+» в конце предыдущей строки, чтобы было ясно, что утверждение продолжается на следующей строке. Ваш путь выстраивает отступы более равномерно, хотя.
  • 0
    @Sean, я тоже этим пользуюсь, и все же предпочитаю ставить '+' в начале каждой новой добавленной строки и в конце ';' на новой линии, потому что я нашел это более «правильным».
Показать ещё 2 комментария
17

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

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 , используемой в браузере, должна быть осторожной.
  • 3
    @HueiTan Документы утверждают, что он также работает в браузере. Что имеет смысл - это просто Function.prototype.String() .
Показать ещё 3 комментария
13

Downvoters. Этот код предоставляется только для информации.

Это было протестировано в 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>
    </li>
EOF*/
// note the script tag here is hardcoded as the FIRST tag 
new_comment=document.currentScript.innerHTML.split("EOF")[1]; 
alert(new_comment.replace('$text','Here goes some text'));
  • 12
    Это ужасно +1. И вы можете использовать document.currentScript вместо getElement ...
  • 0
    currentScript? В каких браузерах? Мой ответ более 2 лет :)
Показать ещё 10 комментариев
10

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

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

Это не работает в firefox или opera; только на IE, хром и сафари.

Он работает в Opera 11. По крайней мере, в пользовательских сценариях JS. Жаль, что я не могу комментировать ответы на отдельные вопросы или отвечать на них, я бы сделал это немедленно. Если возможно, кто-то с более высокими привилегиями, пожалуйста, сделайте это для меня.

  • 0
    Это мой первый актуальный комментарий. Я получил привилегию upvote 2 дня назад, так что я сразу же проголосовал за один ответ, который я упомянул выше. Спасибо всем, кто поддержал мою слабую попытку помочь.
  • 0
    Спасибо всем, кто фактически проголосовал за этот ответ: у меня теперь достаточно привилегий, чтобы оставлять нормальные комментарии! Так что спасибо еще раз.
8

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

Изображение 2067

  • 1
    Не добавит ли это посторонние пробелы?
  • 0
    @tomByrer Да, хорошее наблюдение. Это хорошо только для строк, которые вас не интересуют, например HTML.
8

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

require.js: "требуется текст".

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

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

NPM/браузер: модуль 'brfs'

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

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

Легко.

7

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

var text = `
This
Is
A
Multiline
String
`;

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

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

  • 0
    Любая документация об ограничении iPad / Safari? Кажется, MDN думает, что все хорошо - developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 0
    @Campbeln: CoWorker сказал мне это (он использовал код). Сам не проверял. Может также зависеть от версии для iPad / Safari - так, вероятно, зависит.
7

Мое расширение https://stackoverflow.com/questions/805107/creating-multiline-strings-in-javascript. Он ожидает комментарий в форме /*! 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();
7

Это работает в 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
    Просто подумай об этом. Как вы думаете, это действительно? Не думаете ли вы, что это может вызвать проблемы с отображением?
  • 5
    Почему отрицательные? Это творческий ответ, если не очень практичный!
Показать ещё 2 комментария
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

3

Самый простой способ создания многострочных строк в 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 здесь.

  • 0
    Это теперь совместимо со всеми последними браузерами? Или есть браузеры, которые еще не поддерживают этот синтаксис?
  • 0
    Извините за мой крайний поздний комментарий, отредактировал ответ, добавил информацию о совместимости;)
3

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

Пример:

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

  • 1
    хотя я согласен с вашей точкой зрения, я бы не назвал javascript "хорошим"
3

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

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

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

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

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

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

console.log(hello);
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 элементов - я избегу его в пользу индексированных добавлений для больших массивов.

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, ваш исходный код будет выглядеть так:

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

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

This
is
multiline
string.
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>

Ура!!

  • 0
    <xmp> так устарел. Это может быть разрешено в HTML, но не должно использоваться любыми авторами. См. Stackoverflow.com/questions/8307846/…
  • 0
    @ Берги, вы правы ... и используете <pre>; с escape-символами не поможет в моем решении. Сегодня я столкнулся с подобной проблемой и пытался найти обходной путь ... но в моем случае я нашел один очень нелишный способ исправить эту проблему, поместив вывод в html-комментарии вместо <xmp> или любой другой тег. лол. Я знаю, что это не стандартный способ сделать это, но я буду работать над этим вопросом больше завтра утром .. Ура!
Показать ещё 1 комментарий
0

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

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

Я думаю, что я обнаружил другой способ сделать это inline без какого-либо инвазивного синтаксиса в каждой строке. Используйте функцию 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!
*/}));

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

EDIT: Если бы я прокрутил немного больше, я бы увидел, что этот ответ делает то же самое: https://stackoverflow.com/questions/805107/creating-multiline-strings-in-javascript

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
    хорошо, если после обратной косой черты есть пробел, обратная косая черта выходит за пределы пробела. Предполагается избежать разрыва строки, а не космоса.
-2

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

const str = 'This 

is 

a

multiline text'; 

console.log(str);
  • 0
    Этот ответ не только маленький, неполный и плохо отформатированный, но и не добавляет абсолютно ничего к предыдущим ответам. Отметить его и прыгать, чтобы быть удаленным.
-2

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

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

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: этот пример использует функцию json_encode() PHP, но, безусловно, существуют эквиваленты функций для ASP, Ruby и JSP langs.

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

  • 1
    Это ходячий XSS.
  • 1
    Признаюсь, я делал это несколько раз, чтобы вставить сложные строки в кавычках в javascript, хотя я их предварительно готовлю. Но вы ошибаетесь из-за того, что не можете использовать переменные javascript, вы можете реализовать интерполяцию в стиле кофе-скриптов, которая выглядит как # {this.example}, и заменить использование регулярного выражения .replace функцией закрытия.
-2

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

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');
  • 5
    это ужасно, есть причина, по которой люди НЕ программируют таким образом
  • 6
    Держите HTML там, где он должен быть. В HTML документе. Скрыть HTML-код и использовать JQuery, чтобы показать его, когда это необходимо. Гораздо чище и гораздо более ремонтопригоден.
-2

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

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" было правильным массивом.

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

  • 0
    это работает: function s() { return Array.prototype.join.call(arguments, '\n'); }
-10

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

var myString = "First line" + "\n";
var myString = myString + "Second line" + "\n";
var myString = myString + "Third line" + "\n";
  • 16
    Вы должны использовать var myString += "Second line \n"; вместо. НАМНОГО чище.
  • 11
    На самом деле, вы должны использовать myString += "Second line \n"; var не должен повторяться.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню