Creazione di stringhe multilinea in JavaScript


Risposte:


3319

Aggiornare:

ECMAScript 6 (ES6) introduce un nuovo tipo di letterale, vale a dire letterali template . Hanno molte caratteristiche, interpolazione variabile tra le altre, ma soprattutto per questa domanda, possono essere multilinea.

Un modello letterale è delimitato da backtick :

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

(Nota: non sto sostenendo di usare HTML nelle stringhe)

Il supporto del browser è OK , ma puoi usare i transpiler per essere più compatibile.


Risposta originale ES5:

Javascript non ha una sintassi qui-documento. Puoi sfuggire alla newline letterale, tuttavia, che si avvicina:

"foo \
bar"

231
Attenzione: alcuni browser inseriranno nuove righe in continuazione, altri no.
staticsan

35
Visual Studio 2010 sembra essere confuso anche da questa sintassi.
jcollum,

47
@Nate È specificato nella sezione 7.8.4 di ECMA-262 5th Edition e chiamato LineContinuation : "Un carattere di terminazione di riga non può apparire in una stringa letterale, se non come parte di una LineContinuation per produrre una sequenza di caratteri vuota. Il modo corretto di causare un il carattere di terminazione di riga per far parte del valore String di un valore letterale di stringa consiste nell'utilizzare una sequenza di escape come \ n o \ u000A. "
circa il

16
Non vedo perché lo faresti quando i browser lo trattano in modo incoerente. "line1 \ n" + "line2" su più righe è abbastanza leggibile e ti viene garantito un comportamento coerente.
SamStephens,

11
"Il supporto del browser è OK" ... non supportato da IE11 - non OK
Tom Andraszek,

1318

Aggiornamento ES6:

Come menziona la prima risposta, con ES6 / Babel, ora puoi creare stringhe multilinea semplicemente usando i backtick:

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

L'interpolazione delle variabili è una nuova funzionalità popolare che viene fornita con stringhe delimitate da back-tick:

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

Questo si riduce alla concatenazione:

user.name + ' liked your post about strings'

Risposta originale ES5:

La guida di stile JavaScript di Google consiglia di utilizzare la concatenazione di stringhe invece di sfuggire a nuove righe:

Non farlo:

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

Lo spazio bianco all'inizio di ogni riga non può essere rimosso in modo sicuro al momento della compilazione; gli spazi bianchi dopo la barra comporteranno errori delicati; e mentre la maggior parte dei motori di script supporta questo, non fa parte di ECMAScript.

Utilizzare invece la concatenazione di stringhe:

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
Non capisco la raccomandazione di Google. Tutti i browser tranne quelli estremamente vecchi supportano la barra rovesciata seguita dall'approccio newline e continueranno a farlo in futuro per la compatibilità con le versioni precedenti. L'unica volta che dovresti evitarlo è se hai bisogno di essere sicuro che alla fine di ogni riga sia stata aggiunta una sola riga (o nessuna riga nuova) (vedi anche il mio commento sulla risposta accettata).
Matt Browne,

6
Si noti che le stringhe di modello non sono supportate in IE11, Firefox 31, Chrome 35 o Safari 7. Vedere kangax.github.io/compat-table/es6
EricP

29
@MattBrowne La raccomandazione di Google è già documentata da loro, in ordine di importanza dei motivi: (1) Lo spazio bianco all'inizio di ogni riga [nell'esempio, non vuoi quello spazio bianco nella tua stringa ma sembra più bello nel codice ] (2) gli spazi bianchi dopo la barra comporteranno errori delicati [se si termina una riga \ invece di `\` è difficile accorgersene] e (3) mentre la maggior parte dei motori di script lo supporta, non fa parte di ECMAScript [ovvero perché utilizzare funzionalità non standard?] Ricordate che è una guida di stile, che mira a rendere il codice facile da leggere + maintain + debug: non solo "funziona" correttamente.
ShreevatsaR,

1
sorprendente che dopo tutti questi anni la concatenazione di stringhe sia ancora il modo migliore / più sicuro / più conforme per farlo. i template letterali (sopra la risposta) non funzionano in IE e sfuggire alle righe è solo un casino che presto ti pentirai
Tiago Duarte,

1
Ho scoperto che le versioni precedenti di Android non supportano i backtick, quindi se disponi di un'app Android che utilizza WebView i backtick impediscono l'esecuzione dell'app!
Michael Fever,

684

il modello text = <<"HERE" This Is A Multiline String HEREnon è disponibile in js (ricordo di averlo usato molto nei miei bei vecchi tempi in Perl).

Per tenere sotto controllo le stringhe multiline complesse o lunghe, a volte utilizzo un modello di array:

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

o lo schema anonimo già mostrato (escape newline), che può essere un brutto blocco nel tuo codice:

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

Ecco un altro "trucco" strano ma funzionante 1 :

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

modifica esterna: jsfiddle

ES20xx supporta lo spanning di stringhe su più righe usando stringhe di template :

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 Nota: questo andrà perso dopo aver minimizzato / offuscato il codice


34
Si prega di non utilizzare il modello di array. Nella maggior parte dei casi sarà più lento della semplice concatenazione di stringhe.
BMiner,

73
Il modello di array è più leggibile e la perdita di prestazioni per un'applicazione è spesso trascurabile. Come dimostra quel test perf, anche IE7 può fare decine di migliaia di operazioni al secondo.
Benjamin Atkin,

19
+1 per un'alternativa elegante che non solo funziona allo stesso modo in tutti i browser, ma è anche a prova di futuro.
Pavel,

26
@KooiInc I test iniziano con l'array già creato, che distorce i risultati. Se si aggiunge l'inizializzazione della matrice, la concatenazione rettilineo è più veloce jsperf.com/string-concat-without-sringbuilder/7 See stackoverflow.com/questions/51185/... come un trucco per nuove righe, può essere OK, ma è sicuramente facendo più lavoro di quanto dovrebbe
Juan Mendes il

9
@BMiner: 1) "L'ottimizzazione prematura è la radice di tutti i mali" - Donald Knuth, e 2) "leggibilità" è negli occhi di chi guarda
Paul Bennett

348

È possibile avere le stringhe multilinea in puro JavaScript.

Questo metodo si basa sulla serializzazione delle funzioni, definita dipendente dall'implementazione . Funziona nella maggior parte dei browser (vedi sotto), ma non c'è garanzia che funzionerà ancora in futuro, quindi non fare affidamento su di esso.

Utilizzando la seguente funzione:

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

Puoi avere qui documenti come questo:

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

Il metodo è stato testato con successo nei seguenti browser (non menzionato = non testato):

  • IE 4 - 10
  • Opera 9.50 - 12 (non in 9-)
  • Safari 4 - 6 (non in 3-)
  • Chrome 1 - 45
  • Firefox 17-21 ( non in 16- )
  • Rekonq 0.7.0 - 0.8.0
  • Non supportato in Konqueror 4.7.4

Fai attenzione con il tuo minificatore, però. Tende a rimuovere i commenti. Per il compressore YUI , /*!verrà mantenuto un commento che inizia con (come quello che ho usato).

Penso che una vera soluzione sarebbe usare CoffeeScript .

ES6 AGGIORNAMENTO: è possibile utilizzare il backtick invece di creare una funzione con un commento ed eseguire toString sul commento. Il regex dovrebbe essere aggiornato per eliminare solo gli spazi. Potresti anche avere un metodo prototipo di stringa per fare questo:

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

Quello dovrebbe essere bello. Qualcuno dovrebbe scrivere questo metodo di stringa .removeIndentation ...;)


232
Che cosa!? creare e decompilare una funzione per hackerare un commento su più righe in una stringa su più righe? Ora è brutto.
fforw

4
jsfiddle.net/fqpwf funziona in Chrome 13 e IE8 / 9, ma non in FF6. Odio dirlo, ma mi piace, e se potesse essere una funzione intenzionale di ciascun browser (in modo che non scompaia), lo userei.
Jason Kleban,

2
@ uosɐſ: per essere intenzionale, dovrebbe essere nelle specifiche; o così diffuso, che i produttori di browser non vorrebbero rimuovere questa funzione "accidentale". Grazie per gli esperimenti ... Prova un po 'di caffè.
Jordão,

1
a.toString (). substring (15, a.toString (). length-4) funziona anche e non ha bisogno di scansionare l'intera stringa (anche se molto probabilmente lo farà e il conteggio lo rende comunque un'altra scansione. Oh wel .)
Lodewijk,

2
Estremamente utile. Lo sto usando per (Jasmine) unit test, ma lo sto evitando per il codice di produzione.
Jason,


139

Mi è venuto in mente questo metodo molto stravagante di una corda multi allineata. Poiché la conversione di una funzione in una stringa restituisce anche eventuali commenti all'interno della funzione, è possibile utilizzare i commenti come stringa utilizzando un commento multilinea / ** /. Devi solo tagliare le estremità e hai la tua corda.

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
Questo è assolutamente terrificante. Lo adoro (anche se potresti aver bisogno di fare una partita regex perché non sono sicuro di quanto sia preciso lo spazio bianco toString().
Kevin Cox

Questa soluzione non sembra funzionare in Firefox, forse è una funzione di sicurezza per il browser? EDIT: Nevermind, non funziona solo per Firefox versione 16.
Bill Software Engineer

45
Fai attenzione anche ai minificatori che eliminano i commenti ...: D
jondavidjohn,

3
Questo è il motivo per cui non possiamo avere cose carine.
Danilo M. Oliveira,

4
Puoi fare cose strane in javascript land. Sebbene in tutta onestà, non dovresti mai usarlo.
Luca,

88

Sono sorpreso di non averlo visto, perché funziona ovunque l'ho provato ed è molto utile, ad esempio, per i modelli:

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

Qualcuno sa di un ambiente in cui c'è HTML ma non funziona?


23
Ovunque non desideri mettere le tue stringhe in elementi di script separati e distanti.
Lodewijk,

9
Un'obiezione valida! Non è perfetto Ma per i template, quella separazione non è solo ok, ma forse anche incoraggiata.
Peter V. Mørch,

1
Preferisco suddividere tutto in più di 80/120 caratteri in multilinea, temo che non sia solo un modello. Ora preferisco la sintassi 'line1' + 'line2'. È anche il più veloce (anche se questo potrebbe competere con testi molto grandi). È un bel trucco però.
Lodewijk,

27
in realtà, questo è HTML non Javascript: - /
CpILL

5
tuttavia, il compito di ottenere una stringa multilinea in javascript può essere svolto in questo modo
Davi Fiamenghi,

52

Ho risolto questo problema emettendo un div, rendendolo nascosto e chiamando il div id di jQuery quando ne avevo bisogno.

per esempio

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

Quindi, quando ho bisogno di ottenere la stringa, uso solo il seguente jQuery:

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

Che restituisce il mio testo su più righe. Se chiamo

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

Ottengo:

inserisci qui la descrizione dell'immagine


2
Grazie per questo! È l'unica risposta che ho trovato che risolve il mio problema, che implica stringhe sconosciute che possono contenere qualsiasi combinazione di virgolette singole e doppie direttamente inserite nel codice senza possibilità di pre-codifica. (proviene da un linguaggio di creazione di modelli che crea il JS, sempre da una fonte attendibile e non da un modulo inoltrato, quindi non è COMPLETAMENTE demente).
ottobre

Questo è stato l'unico metodo che effettivamente ha funzionato per me per creare una variabile di stringa javascript multilinea da una stringa Java.
principiante_6

4
Cosa succede se la stringa è HTML?
Dan Dascalescu,

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

1
@Pacerier Tutto ciò che ho letto, da Google così come da altri siti, afferma che oggigiorno Google indicizza i display:nonecontenuti, molto probabilmente a causa della popolarità dei front-end in stile JavaScript. (Ad esempio, una pagina FAQ con funzionalità nascondi / mostra.) Tuttavia, devi stare attento, perché Google dice che possono punirti se il contenuto nascosto sembra essere progettato per gonfiare artificialmente le tue classifiche SEO.
Gavin

31

Esistono diversi modi per raggiungere questo obiettivo

1. Concatenazione della barra

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

2. concatenazione regolare

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

3. Matrice Concatenazione di join

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

Per quanto riguarda le prestazioni, la concatenazione di barra (la prima) è la più veloce.

Fare riferimento a questo caso di prova per maggiori dettagli riguardanti le prestazioni

Aggiornare:

Con ES2015 , possiamo sfruttare la sua funzionalità di stringhe modello. Con esso, dobbiamo solo usare i segni di spunta per creare stringhe a più righe

Esempio:

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

11
Penso che tu abbia appena rigurgitato ciò che è già sulla pagina da cinque anni, ma in modo più pulito.
RandomInsano,

la concatenazione della barra non includerà anche lo spazio bianco all'inizio delle righe?
f.khantsis,

29

Utilizzando i tag di script:

  • aggiungi un <script>...</script>blocco contenente il tuo testo multilinea nel headtag;
  • ottieni il tuo testo multilinea così com'è ... (fai attenzione alla codifica del testo: 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>

Penso che questa strategia sia pulita e poco utilizzata. jsrender lo usa.
xdhmoore,

Lo sto usando con innerText iso innerHTML, ma come posso assicurarmi che gli spazi bianchi siano preservati?
David Nouls,

Anche ajax interroga nel caso in cui le stai usando. Puoi provare a cambiare le intestazioni xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");. Non ricordo di avere altri problemi oltre a scrivere male i commenti in JS. Spazi in cui nessun problema.
jpfreire,

24

Mi piace questa sintassi e indendenza:

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

(ma in realtà non può essere considerato come una stringa multilinea)


3
Lo uso, tranne per il fatto che ho messo il '+' alla fine della riga precedente, per chiarire che l'istruzione continua nella riga successiva. Tuttavia, il tuo modo di allineare i rientri in modo più uniforme.
Sean,

@Sean lo uso anche io, e preferisco ancora mettere il '+' all'inizio di ogni nuova riga aggiunta e il finale ';' su una nuova linea, perché l'ho trovato più "corretto".
AgelessEssence,

7
mettere il + all'inizio consente di commentare quella riga senza dover modificare altre righe quando è la prima / ultima riga della sequenza.
moliad

3
Preferisco anche il + nella parte anteriore poiché visivamente non ho bisogno di scansionare fino alla fine della riga per sapere che il prossimo è una continuazione.
Daniel Sokolowski

18

C'è questa libreria che la rende bellissima:

https://github.com/sindresorhus/multiline

Prima

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

Dopo

var str = multiline(function(){/*
<!doctype html>
<html>
    <body>
        <h1>❤ unicorns</h1>
    </body>
</html>
*/});

1
Questo supporto nodejsnell'uso del browser deve essere attento.
Huei Tan,

3
@HueiTan Docs afferma che funziona anche nel browser. Il che ha senso - è giusto Function.prototype.String().
mikemaccana,

sì, ma diceva "Anche se funziona bene nel browser, è principalmente destinato all'uso in Node.js. Utilizzare a proprio rischio. Mentre funziona bene nel browser, è principalmente destinato all'uso in Node.js. a tuo rischio." (Appena beccato XD)
Huei Tan

@HueiTanYep Ho letto quella parte. Ma Function.prototype.toString () è piuttosto stabile e ben noto.
mikemaccana,

1
La migliore risposta per me perché almeno raggiunge la multilinea senza tutta la spazzatura nel mezzo (La spazzatura all'inizio e alla fine che posso affrontare).
Damien Golding,

14

Downvoter : questo codice è fornito solo a titolo informativo.

Questo è stato testato in Fx 19 e Chrome 24 su 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
È orribile. +1. E puoi usare document.currentScript invece di getElement ...
Orwellophile,

1
"Tu" indefinito in cromo per osx
mplungjan

1
jsfiddle-fixed - Devo aver definito "tu" a livello globale nella mia console. Funziona ora (chrome / osx). La cosa bella dell'aggiunta del commento a una var è che non sei in un contesto di funzione, jsfiddle-function-heredoc anche se la cosa di funzione sarebbe interessante per i metodi di classe. potrebbe essere meglio passargli un oggetto sostitutivo {this: that} comunque. divertente spingere comunque qualcosa di folle al limite :)
Orwellophile,

1
Dimentica gli odiatori. Questa è l'unica barra di risposta corretta ES6. Tutte le altre risposte richiedono concatenazione, calcolo di qualche tipo o fuga. In realtà è piuttosto bello e lo userò come un modo per aggiungere documentazione a un gioco a cui sto lavorando come hobby. Fintanto che questo trucco non viene utilizzato per qualsiasi cosa che possa invocare un bug (posso vedere come qualcuno andrebbe "Punto e virgola, derp. Consente di inserire il commento nella riga successiva" e quindi rompe il codice.) Ma, è è davvero un grosso problema nel mio gioco per hobby? No, e posso usare il trucco per qualcosa di utile. Bella risposta.
Thomas Dignan,

2
Non sono mai stato abbastanza coraggioso da usare questa tecnica nel codice di produzione, ma dove lo uso molto è nei test unitari, dove spesso è più facile scaricare il valore di una struttura come una stringa (piuttosto lunga) e confrontarla con cosa dovrebbe essere.
Ben McIntyre

10

per riassumere, ho provato 2 approcci elencati qui nella programmazione javascript dell'utente (Opera 11.01):

Quindi raccomando l'approccio di lavoro per gli utenti JS degli utenti di Opera. A differenza di ciò che l'autore stava dicendo:

Non funziona su Firefox o Opera; solo su IE, Chrome e Safari.

Funziona in Opera 11. Almeno negli script JS dell'utente. Peccato che non posso commentare le singole risposte o votare la risposta, lo farei immediatamente. Se possibile, qualcuno con privilegi più alti, per favore, fallo per me.


Questo è il mio primo vero commento. Ho ottenuto il privilegio di voto 2 giorni fa, quindi ho immediatamente votato all'unica risposta che ho menzionato sopra. Grazie a chiunque abbia votato il mio debole tentativo di aiutare.
Tyler,

Grazie a tutti coloro che hanno effettivamente votato a favore di questa risposta: ora ho abbastanza privilegi per pubblicare commenti normali! Quindi grazie ancora.
Tyler,

10

La mia estensione a https://stackoverflow.com/a/15558082/80404 . Si aspetta un commento in una forma in /*! any multiline comment */cui il simbolo! viene utilizzato per impedire la rimozione mediante minificazione (almeno per il compressore 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));
};

Esempio:

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

9

Aggiornato per il 2015 : sono passati sei anni: la maggior parte delle persone utilizza un caricatore di moduli, e i principali sistemi di moduli hanno ciascuno dei modi per caricare i modelli. Non è in linea, ma il tipo più comune di stringa multilinea sono i modelli e in genere i modelli devono essere comunque esclusi da JS .

require.js: 'request text'.

Utilizzando il plugin 'text' request.js , con un modello multilinea in template.html

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

NPM / browserify: il modulo 'brfs'

Browserify utilizza un modulo 'brfs' per caricare file di testo. Questo effettivamente costruirà il tuo modello nel tuo HTML aggregato.

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

Facile.


9

Se sei disposto a usare le nuove righe sfuggite, possono essere usate bene . Sembra un documento con un bordo della pagina .

inserisci qui la descrizione dell'immagine


2
Questo non aggiungerebbe spazi vuoti estranei?
tomByrer,

1
@tomByrer Sì, buona osservazione. È utile solo per le stringhe che non ti interessano degli spazi bianchi, ad esempio HTML.
seo,

9

L'equivalente in JavaScript è:

var text = `
This
Is
A
Multiline
String
`;

Ecco le specifiche . Consulta il supporto del browser nella parte inferiore di questa pagina . Ecco anche alcuni esempi .


8

Funziona con IE, Safari, Chrome e 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
Basta pensarci. Pensi che sia valido? Non pensi che possa causare problemi di visualizzazione?
Sk8erPeter,

5
Perché i downvotes? Questa è una risposta creativa, se non molto pratica!
dotancohen,

2
no non lo è. Si dovrebbe piuttosto usare i template: $ .tmpl () ( api.jquery.com/tmpl ) o EJS ( embeddedjs.com/getting_started.html ), ecc. Uno dei motivi per i downgrade è che è davvero lontano da un codice valido questo può causare enormi problemi di visualizzazione.
Sk8erPeter

Spero che nessuno usi mai questa risposta in pratica, ma è un'idea
chiara

7

Puoi usare TypeScript (JavaScript SuperSet), supporta stringhe multilinea e traspila di nuovo in puro JavaScript senza sovraccarico:

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

alert(templates.myString);

Se desideri ottenere lo stesso risultato con JavaScript semplice:

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)

Nota che l'iPad / Safari non supporta 'functionName.toString()'

Se hai un sacco di codice legacy, puoi anche usare la semplice variante JavaScript in TypeScript (per scopi di pulizia):

interface externTemplates
{
    myString:string;
}

declare var templates:externTemplates;

alert(templates.myString)

e puoi usare l'oggetto a stringa multipla dalla semplice variante JavaScript, dove metti i template in un altro file (che puoi unire nel bundle).

Puoi provare TypeScript su
http://www.typescriptlang.org/Playground


Qualche documentazione sulla limitazione di iPad / Safari? MDN sembra pensare che
vada

@Campbeln: CoWorker mi ha detto questo (ha usato il codice). Non l'ho provato da solo. Potrebbe dipendere anche dalla versione per iPad / Safari, quindi probabilmente dipende.
Stefan Steiger,

6

Il modo ES6 per farlo sarebbe usando letterali template:

const str = `This 

is 

a

multiline text`; 

console.log(str);

Più riferimento qui


Questa risposta non è solo piccola, incompleta e formattata in modo errato, ma non aggiunge assolutamente nulla alle risposte precedenti. Contrassegnandolo e saltando per essere eliminato.
Victor Schröder,


4

Il modo più semplice per creare stringhe multilinea in Javascrips è con l'uso di backtick (``). Ciò consente di creare stringhe multilinea in cui è possibile inserire variabili${variableName} .

Esempio:

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

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

my age is: ${age}
`;

console.log(multilineString);

Compatibilità :

  • È stato introdotto in ES6//es2015
  • Ora è supportato nativamente da tutti i principali fornitori di browser (tranne Internet Explorer)

Controlla l'esatta compatibilità nei documenti di Mozilla qui


Questo è ora compatibile con tutti i browser recenti? O ci sono alcuni browser che ancora non supportano questa sintassi?
cmpreshn,

Ci scusiamo per il mio estremo commento in ritardo, modificato la risposta ha aggiunto informazioni sulla compatibilità;)
Willem van der Veen,

3

La mia versione di join basato su array per string 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'));

Questo ha funzionato bene per me, soprattutto perché inserisco spesso valori nell'html costruito in questo modo. Ma ha molte limitazioni. Il rientro sarebbe carino. Non avere a che fare con le virgolette nidificate sarebbe davvero bello, e solo l'ingombrantezza mi disturba.

Il .push () da aggiungere all'array impiega molto tempo? Vedi questa risposta correlata:

( C'è un motivo per cui gli sviluppatori JavaScript non usano Array.push ()? )

Dopo aver esaminato queste (opposte) prove, sembra che .push () vada bene per gli array di stringhe che probabilmente non supereranno i 100 elementi - lo eviterò a favore di aggiunte indicizzate per array più grandi.


3

Puoi usare +=per concatenare la tua stringa, sembra che nessuno abbia risposto a ciò, che sarà leggibile, e anche pulito ... qualcosa del genere

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

può anche essere scritto come

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

console.log(hello);

3

Si noti inoltre che, quando si estende la stringa su più righe utilizzando la barra rovesciata in avanti alla fine di ogni riga, qualsiasi carattere aggiuntivo (principalmente spazi, tabulazioni e commenti aggiunti per errore) dopo la barra rovesciata in avanti causerà un errore di carattere imprevisto, che ho impiegato un'ora per trovare su

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

3

Per amore di Internet, utilizzare la concatenazione di stringhe e scegliere di non utilizzare le soluzioni ES6 per questo. ES6 NON è supportato su tutta la linea, proprio come CSS3 e alcuni browser sono lenti ad adattarsi al movimento CSS3. Utilizza JavaScript semplice, i tuoi utenti finali ti ringrazieranno.

Esempio:

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


3
mentre sono d'accordo con il tuo punto, non definirei javascript "buono" ol
user151496

2

Devi usare l'operatore di concatenazione '+'.

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

Usando il \ntuo codice sorgente apparirà -

Questo 
 <br> è
 <br> multilinea
 <br> stringa.

Utilizzando <br>l'output del browser sarà simile a:

Questo
è
multilinea
corda.

1

Penso che questa soluzione alternativa dovrebbe funzionare in Internet Explorer, Chrome, Firefox, Safari, Opera -

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

Utilizzando Javascript puro:

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

Saluti!!


<xmp>è così deprecato. Potrebbe essere consentito in HTML, ma non dovrebbe essere utilizzato da alcun autore. Vedi stackoverflow.com/questions/8307846/…
Bergi,

@Bergi, hai ragione .. e l'utilizzo <pre>;con le escape non aiuta nella mia soluzione .. Ho riscontrato un problema simile oggi e provando a trovare una soluzione alternativa .. ma nel mio caso, ho trovato un modo molto n00bish per risolvere questo problema inserendo l'output nei commenti HTML anziché <xmp> o qualsiasi altro tag. lol. So che non è un modo standard per farlo, ma lavorerò su questo problema più domani mattina .. Saluti !!
Aditya Hajare,

Sfortunatamente anche con style="display:none"Chrome prova a caricare tutte le <img>immagini menzionate nel blocco di esempio.
Jesse Glick,

0

Ho appena provato la risposta anonima e ho scoperto che qui c'è un piccolo trucco, non funziona se c'è uno spazio dopo la barra rovesciata \
Quindi la seguente soluzione non funziona:

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

Ma quando lo spazio viene rimosso funziona -

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

alert(x.test);​

Spero che sia d'aiuto !!


7
bene ovviamente se hai uno spazio dopo una barra rovesciata, la barra rovesciata sfugge allo spazio. Dovrebbe sfuggire alla rottura della linea, non allo spazio.
Seiano
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.