Création de chaînes multilignes en JavaScript

J'ai le code suivant dans Ruby. Je veux convertir ce code en JavaScript. Quel est le code équivalent dans JS?

text = <<"HERE"
This
Is
A
Multiline
String
HERE
1979
demandé sur Potherca 2009-04-30 06:11:55

30 réponses

mise à jour:

ECMAScript 6 (ES6) introduit un nouveau type de littéral, à savoir template literals 151980920". Ils ont de nombreuses caractéristiques, l'interpolation variable entre autres, mais le plus important pour cette question, ils peuvent être multilignes.

un gabarit littéral est délimité par backticks :

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

(Note: Je ne préconise pas L'utilisation du HTML dans les chaînes de caractères))

le support du navigateur est correct , mais vous pouvez utiliser transpilers pour être plus compatible.


Original ES5 answer:

Javascript n'a pas de syntaxe here-document. Vous pouvez échapper à la nouvelle littérale, cependant, qui se rapproche:

"foo \
bar"
2398
répondu Anonymous 2018-02-14 16:47:51

mise à jour ES6:

comme la première réponse le mentionne, avec ES6 / Babel, vous pouvez maintenant créer des chaînes multilignes simplement en utilisant des Rétro-balises:

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

l'Interpolation des variables est une nouvelle fonctionnalité qui vient avec retour-tique délimité par des chaînes:

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

This just transpires down to concatenation:

user.name + ' liked your post about strings'

Original ES5 answer:

Guide de style JavaScript de Google recommande d'utiliser la concaténation chaîne au lieu d'échapper à newlines:

ne faites pas ceci:

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.';

les espaces blancs au début de chaque ligne ne peuvent pas être supprimés en toute sécurité au moment de la compilation; les espaces blancs après la barre oblique résulteront en erreurs délicates; et bien que la plupart des moteurs de script supportent cela, cela ne fait pas partie d'ECMAScript.

utilisez chaîne de concaténation à la place:

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.';
1137
répondu Devin G Rhode 2018-10-02 19:26:20

le modèle text = <<"HERE" This Is A Multiline String HERE n'est pas disponible dans js (je me souviens l'avoir beaucoup utilisé dans Mes bons vieux jours Perl).

pour garder la surveillance avec des chaînes multilignes complexes ou longues, j'utilise parfois un motif de tableau:

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

ou le modèle anonyme déjà montré (escape newline), qui peut être un bloc laid dans votre code:

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

voici un autre truc bizarre mais efficace 1 :

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

édition externe: jsfiddle

ES20xx prend en charge l'extension de chaînes sur plusieurs lignes en utilisant template strings :

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 Note: Ce sera perdu après minifying / obfuscating votre code

637
répondu KooiInc 2018-08-24 06:58:06

vous can ont des chaînes multilignes en JavaScript pur.

cette méthode est basée sur la sérialisation des fonctions, qui est défini comme dépendant de la mise en œuvre . Il fonctionne dans la plupart des navigateurs (voir ci-dessous), mais il n'y a aucune garantie que cela fonctionnera encore dans l'avenir, donc ne comptez pas sur elle.

utilisant la fonction suivante:

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

vous pouvez avoir ici-documents comme ceci:

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

la méthode a été testée avec succès sur les navigateurs suivants (non mentionné = non testé):

  • IE 4-10
  • Opera 9.50 - 12 (pas 9)
  • Safari 4-6 (not in 3-)
  • Chrome 1-45
  • Firefox 17-21 ( not in 16 - )
  • Rekonq 0.7.0 - 0.8.0
  • non pris en charge dans Konqueror 4.7.4

faites attention avec votre minificateur. Il tend à supprimer les commentaires. Pour le Yui compresseur , un commentaire commençant par /*! (comme celui que j'ai utilisé) sera conservé.

je pense qu'un réel solution serait d'utiliser des CoffeeScript .

329
répondu Jordão 2015-10-09 19:00:36

Vous pouvez le faire...

var string = 'This is\n' +
'a multiline\n' + 
'string';
186
répondu alex 2014-01-19 04:14:47

j'ai inventé cette méthode très jimmy gréée d'une corde multi-doublée. Comme la conversion d'une fonction en une chaîne de caractères renvoie aussi tous les commentaires à l'intérieur de la fonction, vous pouvez utiliser les commentaires comme votre chaîne de caractères en utilisant un commentaire multilingue /**/. Vous avez juste à couper les extrémités et vous avez votre chaîne.

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)
107
répondu Luke 2013-03-21 21:05:15

je suis surpris que je ne l'ai pas vu, parce qu'il fonctionne partout où je l'ai testé et est très utile pour par exemple modèles:

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

est-ce que quelqu'un connaît un environnement où il y a du HTML mais qui ne fonctionne pas?

82
répondu Peter V. Mørch 2012-01-03 19:51:51

j'ai résolu ceci en sortant un div, le rendant caché, et en appelant le div id par jQuery quand j'en avais besoin.

p.ex.

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

alors quand j'ai besoin d'obtenir la chaîne, j'utilise juste le jQuery suivant:

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

qui renvoie mon texte sur plusieurs lignes. Si j'appelle

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

, j'obtiens:

enter image description here

46
répondu Tom Beech 2016-12-16 14:20:52

à l'Aide de balises de script:

  • ajouter un <script>...</script> bloc contenant votre texte à plusieurs lignes en head étiquette;
  • obtenez votre texte multiligne tel quel... (attention au codage de texte: 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>
    
27
répondu jpfreire 2017-01-03 13:58:41

il y a plusieurs façons d'y parvenir

1. Slash concaténation

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

2. concaténation régulière

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

3. Tableau de Rejoindre la concaténation de

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

Performance sage, Barre de concaténation (le premier) est le plus rapide.

Consultez ce cas d'essai pour plus de détails concernant la performance

mise à jour:

avec le ES2015 , nous pouvons profiter de sa fonctionnalité de chaînes de Modèles. Avec elle, nous avons juste besoin d'utiliser back-ticks pour créer des chaînes multi-lignes

exemple:

 `<h1>{{title}}</h1>
  <h2>{{hero.name}} details!</h2>
  <div><label>id: </label>{{hero.id}}</div>
  <div><label>name: </label>{{hero.name}}</div>
  `
26
répondu Vignesh Subramanian 2016-11-08 08:33:50

j'aime cette syntaxe et indentation:

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

(mais en fait ne peut pas être considéré comme chaîne multiligne)

24
répondu semente 2011-12-13 20:09:10

il y a cette bibliothèque qui la rend belle:

https://github.com/sindresorhus/multiline

avant

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

après

var str = multiline(function(){/*
<!doctype html>
<html>
    <body>
        <h1>❤ unicorns</h1>
    </body>
</html>
*/});
17
répondu mightyiam 2014-04-25 11:34:57

Downvoters : ce code n'est fourni qu'à titre d'information.

cela a été testé dans Fx 19 et Chrome 24 sur Mac

DÉMO

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'));
13
répondu mplungjan 2016-01-17 15:44:57

pour résumer, j'ai essayé 2 approches énumérées ici dans la programmation javascript de l'utilisateur (Opera 11.01):

donc je recommande le travail approche pour les utilisateurs D'Opera JS. Contrairement à ce que disait l'auteur:

il ne fonctionne pas sur firefox ou opera; seulement sur IE, chrome et safari.

ça marche à Opera 11. Au moins dans les scripts utilisateur JS. Dommage que je ne puisse pas faire de commentaires sur les réponses individuelles ou upvote la réponse, je le ferais immédiatement. Si possible, quelqu'un avec plus de privilèges s'il vous plaît le faire pour moi.

10
répondu Tyler 2017-05-23 11:47:36

mis à jour pour 2015 : c'est maintenant six ans plus tard: la plupart des gens utilisent un chargeur de module, et les systèmes de modules principaux ont chacun des moyens de charger des gabarits. Il n'est pas en ligne, mais le type le plus commun de chaîne de caractères multilignes sont les gabarits, et gabarits devraient généralement être tenus hors de JS de toute façon .

exiger.js: exigent "texte".

utilisant require.js "texte" plugin , avec un modèle multiligne dans le modèle .html

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

NGP/browserify: le "brfs" module

Browserify utilise un module' brfs ' pour charger des fichiers texte. Cela va réellement construire votre modèle dans votre html empaqueté.

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

facile.

8
répondu mikemaccana 2014-12-31 17:48:21

si vous êtes prêt à utiliser les nouvelles lignes échappées, ils peuvent être utilisés nicely . Il ressemble à un document avec une bordure de page .

enter image description here

8
répondu seo 2015-09-30 14:14:03

cela fonctionne dans IE, Safari, Chrome et 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 .00</span></td>
                        </tr>
                    </table>'></div>
<script type="text/javascript">
    alert($(".crazy_idea").attr("thorn_in_my_side"));
</script>
7
répondu stillatmycomputer 2010-11-23 16:46:29

mon extension à https://stackoverflow.com/a/15558082/80404 . Il attend un commentaire dans une forme /*! any multiline comment */ où le symbole ! est utilisé pour empêcher le démontage par minification (au moins pour le compresseur 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));
};

exemple:

var tmpl = function() { /*!
 <div class="navbar-collapse collapse">
    <ul class="nav navbar-nav">
    </ul>
 </div>
*/}.extractComment();
7
répondu pocheptsov 2017-05-23 10:31:37

vous pouvez utiliser TypeScript (JavaScript SuperSet), il prend en charge les chaînes multilignes, et transpires retour vers le bas à JavaScript pur sans frais généraux:

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

alert(templates.myString);

si vous voulez accomplir la même chose avec JavaScript simple:

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)

notez que l'iPad / Safari ne supporte pas 'functionName.toString()'

si vous avez beaucoup de code d'héritage, vous pouvez également utiliser la variante JavaScript simple dans Tapescript (à des fins de nettoyage):

interface externTemplates
{
    myString:string;
}

declare var templates:externTemplates;

alert(templates.myString)

et vous pouvez utiliser l'objet multiligne-chaîne de la variante JavaScript simple, où vous mettez les gabarits dans un autre fichier (que vous pouvez fusionner dans le faisceau).

vous pouvez essayer le typographie à

http://www.typescriptlang.org/Playground

7
répondu Stefan Steiger 2015-10-07 13:12:07

l'équivalent en javascript est:

var text = `
This
Is
A
Multiline
String
`;

Voici la spécification . Voir la prise en charge du navigateur au bas de cette page . Voici quelques exemples .

7
répondu Lonnie Best 2015-11-04 14:06:18

ES6 vous permet d'utiliser un backtick pour spécifier une chaîne sur plusieurs lignes. Ça s'appelle un modèle littéral. Comme ceci:

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

utilise le backtick fonctionne dans NodeJS, et il est soutenu par Chrome, Firefox, Edge, Safari, et Opera.

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

5
répondu earl3s 2016-03-28 18:43:26

ma version de jointure basée sur un tableau pour chaîne 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'));

cela a bien fonctionné pour moi, surtout que j'insère souvent des valeurs dans le html construit de cette façon. Mais il a beaucoup de limitations. Une Indentation serait bien. Ne pas avoir à traiter avec les guillemets emboîtés serait vraiment agréable, et juste la lourdeur de celui-ci me dérange.

est le .push() pour ajouter à l'éventail de prendre beaucoup de temps? Voir cette réponse:

( y a-t-il une raison pour laquelle les développeurs JavaScript n'utilisent pas Array.push()? )

après avoir regardé ces essais (opposés), on dirait .push () est parfait pour les tableaux de chaînes de caractères qui ne dépasseront probablement pas 100 éléments - Je l'éviterai en faveur des ajouts indexés pour les tableaux plus grands.

3
répondu KTys 2017-05-23 12:34:59

Vous pouvez utiliser += pour concaténer votre chaîne, semble comme personne ne répondait, qui sera lisible, et aussi soignée... quelque chose comme ça

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

peut aussi s'écrire comme

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

console.log(hello);
3
répondu Mr. Alien 2014-01-18 13:18:54

aussi noter que, lors de l'extension de la chaîne sur plusieurs lignes en utilisant le antislash en avant à la fin de chaque ligne, tout caractère supplémentaire (la plupart des espaces, onglets et commentaires ajoutés par erreur) après le antislash en avant causera une erreur de caractère inattendue, ce que j'ai pris une heure pour le découvrir

var string = "line1\  // comment, space or tabs here raise error
line2";
3
répondu Prakash GPz 2016-07-13 19:25:31

s'il vous Plaît, pour l'amour de l'utilisation d'internet de concaténation de chaîne et de choisir de ne pas utiliser ES6 des solutions pour cela. ES6 n'est pas supporté partout, un peu comme CSS3 et certains navigateurs étant lents à s'adapter au mouvement CSS3. Utilisez le bon vieux JavaScript, vos utilisateurs finaux vous remercieront.

exemple:

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

3
répondu Pragmatiq 2017-10-11 23:28:47
"151940920 ` la façon la plus facile de faire des chaînes multilignes en Javascrips est d'utiliser des bâtons ("). Cela vous permet de créer des chaînes multilignes dans lesquelles vous pouvez insérer des variables avec ${variableName} .

exemple:

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

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

my age is: ${age}
`;

console.log(multilineString);

compatibilité:

  • il a été introduit dans ES6 // es2015
  • il est maintenant nativement pris en charge par tous les principaux navigateurs vendeurs (sauf internet explorer)

Vérifiez la compatibilité exacte dans Mozilla docs ici

3
répondu Willem van der Veen 2018-10-01 21:27:45

Vous devez utiliser l'opérateur de concaténation '+'.

<!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>

en utilisant \n votre code source ressemblera à -

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

en utilisant <br> la sortie de votre navigateur ressemblera à -

This
is
multiline
string.
2
répondu Sonevol 2017-08-13 22:57:20

je pense que cette solution devrait fonctionner dans IE, Chrome, Firefox, Safari, Opera -

utilisant 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>

Utilisant Pur 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>

santé!!

1
répondu Aditya Hajare 2013-01-28 12:20:46

vient d'essayer la réponse anonyme et trouvé il ya un petit truc ici, il ne fonctionne pas s'il ya un espace après backslash \

Donc la solution suivante ne fonctionne pas -

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

mais quand l'espace est enlevé il fonctionne -

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

alert(x.test);​

Espère que cela aide !!

0
répondu Anmol Saraf 2012-11-23 13:10:00

si vous vous trouvez à exécuter dans le noeud seulement, vous pouvez utiliser le module fs pour lire dans la chaîne multi-ligne à partir d'un fichier:

var diagram;
var fs = require('fs');
fs.readFile( __dirname + '/diagram.txt', function (err, data) {
  if (err) {
    throw err; 
  }
  diagram = data.toString();
});
0
répondu Charles Brandt 2014-09-09 00:02:29