JavaScript'te çok satırlı dizeler oluşturma


Yanıtlar:


3317

Güncelleme:

ECMAScript 6 (ES6) yeni bir değişmez tür, yani şablon değişmezler tanıtır . Birçok özelliği var, diğerleri arasında değişken enterpolasyon, ancak en önemlisi bu soru için çok satırlı olabilirler.

Bir şablon değişmez değeri backticks ile sınırlandırılır :

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

(Not: Dizelerde HTML kullanmayı savunmuyorum)

Tarayıcı desteği uygun , ancak daha uyumlu olması için transpilleri kullanabilirsiniz .


Orijinal ES5 yanıtı:

Javascript'in burada belge sözdizimi yok. Ancak, yakın gelen yeni satırdan kaçabilirsiniz:

"foo \
bar"

231
Dikkatli olun: bazı tarayıcılar devamında yeni satırlar ekler, bazıları eklemez.
staticsan

35
Visual Studio 2010'un da bu sözdizimi ile karıştırıldığı görülmektedir.
jcollum

47
@Nate ECMA-262 5. Baskı bölüm 7.8.4'te belirtilir ve LineContinuation olarak adlandırılır : " Boş karakter dizisini üretmek için LineContinuation'ın bir parçası hariç, bir satır sonlandırıcı karakter dizgi değişmezinde görünemez . satır sonlandırıcı karakteri bir dizgi değişmezinin String değerinin bir parçası olmak için \ n veya \ u000A gibi bir kaçış dizisi kullanmaktır. "
Bazıları

16
Tarayıcılar tutarsız davrandığında bunu neden yapacağınızı anlamıyorum. Birden çok satıra "satır1 \ n" + "satır2" yeterince okunabilir ve tutarlı davranış garantisi veriliyor.
SamStephens

11
"Tarayıcı desteği TAMAM" ... IE11 tarafından desteklenmiyor - TAMAM değil
Tom Andraszek

1317

ES6 Güncellemesi:

İlk yanıttan bahsedildiği gibi, ES6 / Babel ile artık basit bir şekilde ters tırnakları kullanarak çok satırlı dizeler oluşturabilirsiniz:

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

Enterpolasyon değişkenleri, geri işaretli sınırlandırılmış dizelerle gelen popüler yeni bir özelliktir:

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

Bu sadece birleştirme işlemine aktarılır:

user.name + ' liked your post about strings'

Orijinal ES5 yanıtı:

Google'ın JavaScript stil kılavuzu , yeni satırlardan kaçmak yerine dize birleştirmeyi kullanmanızı önerir:

Bunu yapma:

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

Her satırın başındaki boşluk derleme zamanında güvenle çıkarılamaz; eğik çizgi sonrasındaki boşluk zor hatalara neden olur; ve çoğu komut dosyası motoru bunu desteklese de, ECMAScript'in bir parçası değildir.

Bunun yerine dize birleştirmeyi kullanın:

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'ın önerisini anlamıyorum. Oldukça eski olanlar dışındaki tüm tarayıcılar ters eğik çizgiyi ve ardından yeni satır yaklaşımını destekler ve gelecekte geriye dönük uyumluluk için bunu yapmaya devam edecektir. Bundan kaçınmanız gereken tek zaman, her satırın sonuna yalnızca bir satırsonu (veya satırsonu yok) eklendiğinden emin olmanız gerektiğidir (ayrıca kabul edilen yanıt hakkındaki yorumuma bakın).
Matt Browne

6
Şablon dizelerinin IE11, Firefox 31, Chrome 35 veya Safari 7'de desteklenmediğini unutmayın. Bkz. Kangax.github.io/compat-table/es6
EricP

29
@MattBrowne Google'ın önerisi, nedenlerin önemine göre zaten onlar tarafından belgelenmiştir: (1) Her satırın başındaki boşluk [örnekte, dizenizde boşluk olmasını istemezsiniz ancak kodda daha güzel görünür ] (2) eğik çizgi sonrasındaki boşluk zor hatalarla sonuçlanır [eğer \ \ \ yerine bir satırı bitirirseniz fark edilir] ve (3) çoğu komut dosyası motoru bunu desteklerken, ECMAScript'in bir parçası değildir. standart olmayan özellikler kullanın?] Bu, kodun okunmasını + sürdürmesini + hata ayıklamasını kolaylaştırmakla ilgili bir stil kılavuzu olduğunu unutmayın: sadece "çalışır" değil.
ShreevatsaR

1
tüm bu yıllar sonra dize birleştirme hala bununla gitmek için en iyi / en güvenli / en uyumlu yolu olmasıdır. (cevap yukarıda) şablonu değişmezleri IE çalışmak ve çizgileri kaçan yakında pişman olacaksın bu sadece bir karmaşa yok
Tiago Duarte

1
Android'in eski sürümlerinin backtick'leri desteklememesinin zor yolunu öğrendim, böylece web'i kullanan bir Android uygulamanız varsa backView'larınız uygulamanızın çalışmamasına neden olur!
Michael Fever

684

desen text = <<"HERE" This Is A Multiline String HEREjs mevcut değil (eski eski Perl günlerde çok kullandığımı hatırlıyorum).

Karmaşık veya uzun çok satırlı dizelerle gözetimi sürdürmek için bazen bir dizi deseni kullanırım:

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

veya anonim kalıp zaten gösterildi (yeni satırdan kaç), bu da kodunuzda çirkin bir blok olabilir:

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

İşte başka bir garip ama çalışan 'numara' 1 :

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

dış düzenleme: jsfiddle

ES20xx , şablon dizeleri kullanarak birden çok satıra yayılan dizeleri destekler :

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 Not: kodunuz küçültüldükten / gizlendikten sonra kaybolacaktır


34
Lütfen dizi desenini kullanmayın. Çoğu durumda düz-eski dize birleşiminden daha yavaş olacaktır.
BMiner

73
Dizi deseni daha okunabilir ve bir uygulama için performans kaybı genellikle önemsizdir. Bu mükemmel testin gösterdiği gibi, IE7 bile saniyede on binlerce işlem yapabilir.
Benjamin Atkin

19
Sadece tüm tarayıcılarda aynı şekilde çalışan, aynı zamanda geleceğe dönük zarif bir alternatif için +1.
Pavel

26
@KooiInc Testleriniz zaten yaratılmış olan ve sonuçları çarpıtan diziyle başlar. Dizinin başlatılmasını eklerseniz, düz birleştirme daha hızlıdır jsperf.com/string-concat-without-sringbuilder/7 Bkz. Stackoverflow.com/questions/51185/… Yeni satırlar için bir hile olarak, sorun yok, ancak kesinlikle olması gerekenden daha fazla iş yapıyor
Juan Mendes

9
@BMiner: 1) "Erken optimizasyon tüm kötülüğün köküdür" - Donald Knuth ve 2) 'okunabilirlik' seyircinin gözünde
Paul Bennett

348

Sen edebilirsiniz saf JavaScript satırlı dizeleri var.

Bu yöntem, uygulamaya bağlı olarak tanımlanan işlevlerin serileştirilmesine dayanır . Çoğu tarayıcıda çalışır (aşağıya bakın), ancak gelecekte de çalışacağının garantisi yoktur, bu yüzden ona güvenmeyin.

Aşağıdaki işlevi kullanarak:

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

Burada böyle belgelere sahip olabilirsiniz:

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

Yöntem, aşağıdaki tarayıcılarda başarıyla test edildi (belirtilmedi = test edilmedi):

  • IE 4-10
  • Opera 9.50 - 12 (9-'da değil)
  • Safari 4-6 (3- değil)
  • Krom 1-45
  • Firefox 17-21 ( 16- değil )
  • Rekonq 0.7.0 - 0.8.0
  • Konqueror 4.7.4'te desteklenmez

Bununla birlikte, kıyma makinesine dikkat et. Yorumları kaldırma eğilimindedir. İçin YUI kompresör , bir yorum ile başlayan /*!korunacaktır (ben gibi).

Bence gerçek bir çözüm CoffeeScript kullanmak olacaktır .

ES6 GÜNCELLEME: Yorum içeren bir işlev oluşturmak ve yorumda toString komutunu çalıştırmak yerine backtick'i kullanabilirsiniz. Normal ifadenin yalnızca şerit boşluklarına güncellenecek şekilde güncellenmesi gerekir. Bunu yapmak için bir dize prototip yönteminiz de olabilir:

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

Süper olurdu. Birisi bu .removeIndentation dize yöntemini yazmalıdır ...;)


232
Ne!? çok satırlı bir yorumu çok satırlı bir dize haline getirmek için bir İşlev oluşturma ve kod çözme? Şimdi bu çirkin.
fforw

4
jsfiddle.net/fqpwf , Chrome 13 ve IE8 / 9'da çalışır, ancak FF6'da çalışmaz. Söylemekten nefret ediyorum, ama hoşuma gidiyor ve her tarayıcının kasıtlı bir özelliği olabilirse (böylece kaybolmayacaktı), onu kullanardım.
Jason Kleban

2
@ uosɐſ: kasıtlı olması için spesifikasyonda olması gerekir; ya da o kadar yaygın kullanıldıysa, tarayıcı üreticileri bu "yanlışlıkla" özelliği kaldırmak istemeyeceklerdir. Yine de deneyler için teşekkürler ... Biraz kahve deneyin.
Jordão

1
a.toString (). substring (15, a.toString (). uzunluk-4) de çalışır ve tüm dizeyi taraması gerekmez (büyük olasılıkla olur ve sayma yine de başka bir tarama yapar. .)
Lodewijk

2
Son derece kullanışlı. (Jasmine) birim testleri için kullanıyorum ama üretim kodu için kaçınıyorum.
Jason


139

Çok çizgili bir ipin bu çok jimmy hileli yöntemini buldum. Bir işlevi bir dizeye dönüştürdüğünden, işlevin içindeki yorumları da döndürdüğünden, yorumları çok satırlı bir yorum / ** / kullanarak dizeniz olarak kullanabilirsiniz. Sadece uçları kesmeniz ve ipiniz var.

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
Bu kesinlikle korkutucu. Bunu seviyorum (regex maçı yapmanız gerekebilir, ancak boşlukun ne kadar hassas olduğundan emin değilim toString().
Kevin Cox

Bu çözüm firefox'ta çalışmıyor gibi görünüyor, belki de tarayıcı için bir güvenlik özelliği? EDIT: Nevermind, sadece Firefox sürüm 16 için çalışmaz
Bill Yazılım Mühendisi

45
Ayrıca yorumlar şerbetçiotu dikkat edin ...: D
jondavidjohn

3
Bu yüzden güzel şeylere sahip olamayız.
Danilo M. Oliveira

4
Javascript topraklarında bazı garip şeyler yapabilirsiniz. Dürüst olmak gerekirse, bunu asla kullanmamalısınız.
Luke

88

Bunu görmediğime şaşırdım, çünkü test ettiğim her yerde çalışıyor ve örneğin şablonlar için çok yararlı:

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

HTML olan ancak çalışmayan bir ortam bilen var mı?


23
Dizelerinizi ayrı ve uzak komut dosyası öğelerine koymak istemediğiniz her yerde.
Lodewijk

9
Geçerli bir itiraz! Mükemmel değil. Ancak şablonlar için, bu ayrım sadece tamam değil, belki de teşvik edilir.
Peter V. Mørch

1
Ben 80/120 karakter üzerinde her şeyi çok satırlı bölmeyi tercih ediyorum, korkarım ki bu sadece şablonlardan daha fazlası. Şimdi 'line1' + 'line2' sözdizimini tercih ediyorum. Aynı zamanda en hızlısıdır (bu gerçekten büyük metinler için rakip olabilir). Yine de güzel bir numara.
Lodewijk

27
aslında, bu HTML değil Javascript: - /
CpILL

5
ancak, javascript çok satırlı bir dize elde etme görevi bu şekilde yapılabilir
Davi Fiamenghi

52

Ben bir div çıktı, gizli yapma ve ben gerektiğinde jQuery div id çağırarak bunu çözdü.

Örneğin

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

Sonra dize almak gerektiğinde, ben sadece aşağıdaki jQuery kullanın:

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

Bu, metnimi birden çok satıra döndürür. Ararsam

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

Alırım:

resim açıklamasını buraya girin


2
Bunun için teşekkürler! Sorunumu çözdüğümü bulduğum tek cevap, ön kodlama fırsatı olmadan doğrudan koda eklenen tek ve çift tırnakların herhangi bir kombinasyonunu içeren bilinmeyen dizeleri içeriyor. (JS'yi oluşturan formel bir dilden geliyor - hala güvenilir bir kaynaktan değil, bir form gönderimi değil, bu yüzden TAMAMEN bunalı değil).
octern

Bu, bir Java String'den çok satırlı bir javascript dize değişkeni oluşturmak için gerçekten işe yarayan tek yöntemdi.
beginner_

4
Dize HTML ise ne olur?
Dan Dascalescu

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

1
@Pacerier Google'dan ve diğer sitelerden okuduğum her şey, günümüzde Google'ın display:nonebüyük olasılıkla JavaScript tarzı ön uçların popülaritesi nedeniyle dizin içeriği yaptığını söylüyor . (Örneğin, gizleme / gösterme işlevselliğine sahip bir SSS sayfası.) Ancak dikkatli olmanız gerekir, çünkü Google, gizli içerik SEO sıralamalarınızı yapay olarak şişirmek için tasarlanmış gibi görünüyorsa sizi cezalandırabileceklerini söylüyor.
Gavin

31

Bunu başarmanın birden fazla yolu var

1. Eğik çizgi birleştirme

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

2. düzenli birleştirme

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

3. Dizi Birleştirme birleşimi

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

Performans açısından, Slash birleşimi (birincisi) en hızlısıdır.

Performansla ilgili daha fazla ayrıntı için bu test senaryosuna bakın

Güncelleme:

İle ES2015 , biz onun Şablon dizeleri özellikten yararlanabilir. Bununla birlikte, çok satırlı dizeler oluşturmak için sadece keneler kullanmamız gerekiyor

Misal:

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

11
Sanırım sayfada zaten beş yıldır olanlardan daha az pişman oldunuz, ancak daha temiz bir şekilde.
RandomInsano

birleştirme eğik çizgi satır başlangıcında boşluk dahil değil mi?
f.khantsis

29

Komut dosyası etiketlerini kullanma:

  • etikete <script>...</script>çok satırlı metninizi içeren bir blok ekleyin head;
  • çok satırlı metninizi olduğu gibi alın ... (metin kodlamasına dikkat edin: 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>

Bence bu strateji temiz ve çok az kullanılıyor. jsrender bunu kullanır.
xdhmoore

Bu innerText iso innerHTML ile kullanıyorum, ama beyaz alanların korunduğundan nasıl emin olabilirim?
David Nouls

Ayrıca ajax bunları kullanıyorsanız sorgular. xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");Başlığınızı değiştirmeyi deneyebilirsiniz JS'deki yorumları yanlış yazmaktan başka sorun yaşadığımı hatırlamıyorum. Sorun olmayan uzaylar.
jpfreire

24

Bu sözdizimi ve girinti gibi:

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

(ancak aslında çok satırlı dize olarak kabul edilemez)


3
Bir sonraki satırda ifadenin devam ettiğini açıkça belirtmek için önceki satırın sonuna '+' koymam dışında bunu kullanıyorum. Yolunuz girintileri daha eşit bir şekilde sıralar.
Sean

@Sean bunu da kullanıyorum ve yine eklenen her yeni satırın başına '+' ve son '' koymayı tercih ediyorum; yeni bir satırda, çünkü daha 'doğru' buldum.
AgelessEssence

7
+ işaretini başında koymak, dizinin ilk / son satırı olduğunda diğer satırları düzenlemek zorunda kalmadan o satırın yorum yapmasına izin verir.
moliad

3
Görsel olarak öndeki + 'yı tercih ediyorum çünkü bir sonrakinin bir devam olduğunu bilmek için çizginin sonuna taramaya gerek yok.
Daniel Sokolowski

18

Onu güzelleştiren bu kütüphane var:

https://github.com/sindresorhus/multiline

Önce

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

Sonra

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

1
Bu destek nodejs, tarayıcıda kullanımı dikkatli olmalıdır.
Huei Tan

3
@HueiTan Dokümanlar, tarayıcıda da çalıştığını belirtir. Bu mantıklı - sadece Function.prototype.String().
mikemaccana

"Ancak tarayıcıda iyi çalışır, ancak özellikle Node.js'de kullanılmak üzere tasarlanmıştır. Kendi sorumluluğunuzdadır. kendi sorumluluğunuzdadır. " (Sadece becareful XD)
Huei Tan

@HueiTanYep Bu bölümü okudum. Ancak Function.prototype.toString () oldukça kararlı ve iyi bilinmektedir.
mikemaccana

1
Benim için en iyi cevap, çünkü en azından ortadaki tüm çöpler olmadan çok satırlı (Başta ve sonunda başa çıkabileceğim çöp) olmadan çok satırlı elde ediyor.
Damien Golding

14

Downvoters : Bu kod yalnızca bilgi amaçlıdır.

Bu, Mac'te Fx 19 ve Chrome 24'te test edildi

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
Bu çok korkunç. +1. Ve getElement yerine document.currentScript kullanabilirsiniz ...
Orwellophile

1
Tanımlanmamış "sen" krom için osx
mplungjan

1
jsfiddle-fixed - Konsolumda global olarak "siz" tanımlamış olmalıydım. Şimdi çalışıyor (krom / osx). Bir değişkene yorum eklemekle ilgili güzel şey, bir işlev bağlamında, jsfiddle-function-heredoc'da bulunmamanıza rağmen, işlev şey sınıf yöntemleri için havalı olacaktır. yine de bunun yerine {this: that} nesnesini iletmek daha iyi olabilir. yine de sınırına deli bir şey itmek için eğlenceli :)
Orwellophile

1
Nefretçileri unut. Bu tek doğru yanıt çubuğu ES6'dır. Diğer tüm cevaplar birleştirme, bir tür hesaplama veya kaçmayı gerektirir. Bu gerçekten harika ve hobi olarak üzerinde çalıştığım bir oyuna belge eklemenin bir yolu olarak kullanacağım. Bu hile bir hata çağırabilecek bir şey için kullanılmadığı sürece (Birisinin nasıl gideceğini görebiliyorum "Noktalı virgül, derp. Bir sonraki satıra yorum yapalım." Ve sonra kodunuzu kırıyor.) Ama, Bu hobi oyunumda gerçekten büyük bir sorun mu? Hayır, havalı numarayı yararlı bir şey için kullanabilirim. Mükemmel cevap.
Thomas Dignan

2
Bu tekniği üretim kodunda kullanacak kadar cesur olmadım, ancak çok fazla kullandığım birim testte, çoğu zaman bir yapının değerini (oldukça uzun) bir dize olarak dökmek ve karşılaştırmak en kolay olanı ne olmalı '.
Ben McIntyre

10

Özetle, burada kullanıcı javascript programlama (Opera 11.01) listelenen 2 yaklaşım denedim:

Bu yüzden Opera kullanıcı JS kullanıcıları için çalışma yaklaşımını öneriyorum. Yazarın söylediklerinin aksine:

Firefox veya opera üzerinde çalışmaz; sadece IE, chrome ve safari'de.

Opera 11'de çalışır. En azından kullanıcı JS betiklerinde. Çok kötü bireysel cevaplar hakkında yorum yapamıyorum veya cevabı oylayamıyorum, hemen yapardım. Mümkünse, daha yüksek ayrıcalıklara sahip biri lütfen benim için yap.


Bu benim ilk gerçek yorumum. Yukarı oy ayrıcalığını 2 gün önce kazandım, bu yüzden yukarıda bahsettiğim bir cevabı hemen iptal ettim. Yardım etme girişimimi kötüleştiren herkese teşekkür ederim.
Tyler

Bu cevabı gerçekten onaylayan herkese teşekkürler: Artık normal yorum göndermek için yeterli ayrıcalığım var! Tekrar teşekkürler.
Tyler

10

Benim uzatma https://stackoverflow.com/a/15558082/80404 . /*! any multiline comment */Sembolün bulunduğu bir formda yorum bekliyor ! küçültülerek çıkarılmasını önlemek için kullanılır (en azından YUI kompresörü için)

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

Misal:

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

9

2015 için güncellendi : altı yıl sonra: çoğu insan bir modül yükleyici kullanıyor ve ana modül sistemlerinin her birinin şablon yükleme yöntemleri var. Satır içi değil, ancak en yaygın çok satırlı dize şablonlardır ve şablonlar genellikle JS dışında tutulmalıdır .

requir.js: 'metin gerektir'.

Kullanılması require.js 'text' eklentisi çok satırlı şablon içinde olan, template.html

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

NPM / browserify: 'brfs' modülü

Browserify , metin dosyalarını yüklemek için bir 'brfs' modülü kullanır . Bu aslında şablonunuzu paketlenmiş HTML'nize dönüştürür.

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

Kolay.


9

Eğer kaçan yeni satırları kullanmaya istekli iseniz, bunlar güzel bir şekilde kullanılabilir . Sayfa kenarlığı olan bir belgeye benziyor .

resim açıklamasını buraya girin


2
Bu, fazladan boşluk bırakmaz mı?
tomByrer

1
@tomByrer Evet, iyi gözlem. Yalnızca beyaz boşlukla ilgilenmediğiniz dizeler için iyidir, örneğin HTML.
seo


8

IE, Safari, Chrome ve Firefox'ta çalışır:

<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
Bunun hakkında düşün. Sizce geçerli mi? Ekran sorunlarına neden olabileceğini düşünmüyor musunuz?
Sk8erPeter

5
Neden inişler? Çok pratik olmasa da bu yaratıcı bir cevap!
12:32 de dotancohen

2
hayır değil. Bunun yerine şablonlar kullanılmalıdır: $ .tmpl () ( api.jquery.com/tmpl ) veya EJS ( embeddedjs.com/getting_started.html ), vb. bu büyük ekran sorunlarına neden olabilir.
Sk8erPeter

Umarım hiç kimse bu cevabı pratikte kullanmaz, ama temiz bir fikir
DCShannon

7

Sen kullanabilirsiniz typescript (JavaScript set), bu satırlı dizeleri destekler ve transpiles yükü olmadan saf JavaScript geri adım:

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

alert(templates.myString);

Aynı şeyi düz JavaScript ile gerçekleştirmek istiyorsanız:

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)

İPad / Safari'nin desteklemediğini unutmayın 'functionName.toString()'

Çok fazla eski kodunuz varsa, TypeScript'te düz JavaScript varyantını da kullanabilirsiniz (temizleme amacıyla):

interface externTemplates
{
    myString:string;
}

declare var templates:externTemplates;

alert(templates.myString)

ve şablonları başka bir dosyaya (pakette birleştirebileceğiniz) düz JavaScript değişkeninden çok satırlı dizgi nesnesini kullanabilirsiniz.

TypeScript'i http://www.typescriptlang.org/Playground adresinden deneyebilirsiniz


İPad / Safari sınırlamasıyla ilgili herhangi bir belge var mı? MDN her şeyin iyi olduğunu düşünüyor gibi - developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Campbeln

@Campbeln: CoWorker bunu söyledi (kodu kullandı). Kendim test etmedim. Ayrıca iPad / Safari sürümüne de bağlı olabilir - muhtemelen bağlıdır.
Stefan Steiger

6

Bunu yapmanın ES6 yolu şablon değişmezlerini kullanmak olacaktır:

const str = `This 

is 

a

multiline text`; 

console.log(str);

Daha fazla referans burada


Bu cevap sadece küçük, eksik ve kötü biçimlendirilmiş değil, aynı zamanda önceki cevaplara kesinlikle hiçbir şey katmıyor. İşaretlemek ve silinmek için atlamak.
Victor Schröder


4

Javascrips'te çok satırlı dizeler yapmanın en kolay yolu, backticks (``) kullanmaktır. Bu, içine değişkenler ekleyebileceğiniz çok satırlı dizeler oluşturmanıza olanak tanır ${variableName}.

Misal:

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

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

my age is: ${age}
`;

console.log(multilineString);

uyumluluk:

  • ES6// ile tanıtıldıes2015
  • Artık tüm büyük tarayıcı satıcıları tarafından yerel olarak desteklenmektedir (internet explorer hariç)

Mozilla belgelerinde tam uyumluluğu kontrol edin


Bu artık tüm yeni tarayıcılarla uyumlu mu? Veya bu sözdizimini hala desteklemeyen bazı tarayıcılar var mı?
cmpreshn

Benim aşırı geç yorum için özür dilerim, cevap eklendi uyumluluk bilgilerini düzenledi;)
Willem van der Veen

3

Dize concat için dizi tabanlı birleştirme sürümüm:

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

Bu benim için iyi çalıştı, özellikle de bu şekilde oluşturulan html'ye değerler eklediğim için. Ancak birçok sınırlaması var. Girinti iyi olurdu. İç içe tırnak işaretleri ile uğraşmak gerçekten hoş olmazdı ve sadece ciddiyeti beni rahatsız ediyor.

Diziye eklenecek .push () çok zaman alıyor mu? Bu ilgili cevaba bakın:

( JavaScript geliştiricilerinin Array.push () kullanmamasının bir nedeni var mı? )

Bu (karşıt) test çalışmalarına baktıktan sonra, .push () 100 öğeden fazla büyümeyecek dize dizileri için iyi görünüyor - Daha büyük diziler için dizinlenmiş ekler lehine kaçınacağım.


3

+=Dizenizi birleştirmek için kullanabilirsiniz , kimse cevap vermiyor gibi görünüyor, ki bu okunabilir ve aynı zamanda düzgün olacak ... böyle bir şey

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

olarak da yazılabilir

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

console.log(hello);

3

Ayrıca, her satırın sonunda ileri geri eğik çizgi kullanarak dizeyi birden çok satır üzerine genişletirken, ileri geri eğik çizgiden sonra herhangi bir fazladan karakterin (çoğunlukla boşluklar, sekmeler ve yorumlar), beklenmedik karakter hatasına neden olacağına dikkat edin. dışarı

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

3

Lütfen internet sevgisi için dize birleştirme kullanın ve bunun için ES6 çözümlerini kullanmamayı tercih edin. ES6, CSS3 ve bazı tarayıcıların CSS3 hareketine uyum sağlaması gibi, kartın her yerinde desteklenmiyor. Sade ol JavaScript kullanın, son kullanıcılarınız size teşekkür edecektir.

Misal:

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


3
ben senin noktayı kabul ederken, ben javascript "iyi" ol
çağırmaz

2

'+' Birleştirme işlecini kullanmanız gerekir.

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

Kullanarak \nKaynak kodunuzu şöyle görünecektir -

Bu 
 <br> olduğunu
 <br> satırlı
 <br> dize.

<br>Tarayıcınızı kullanarak çıktı gibi görünecektir -

Bu
dır-dir
satırlı
dize.

1

Bu geçici çözüm IE, Chrome, Firefox, Safari, Opera -

JQuery kullanma :

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

Saf Javascript kullanma:

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

Alkış !!


<xmp>çok reddedildi. HTML'de izin verilebilir, ancak hiçbir yazar tarafından kullanılmamalıdır. Bkz. Stackoverflow.com/questions/8307846/…
Bergi

@Bergi, haklısın .. ve <pre>;kaçışları ile benim çözümümde kullanmayacağım .. Bugün benzer bir sorunla karşılaştım ve bir çözüm bulmaya çalıştım .. ama benim durumumda, bu sorunu çözmek için çok n00bish bir yol buldum <xmp> veya başka bir etiket yerine html yorumlarına çıktı yerleştirme. lol. Bunu yapmak için standart bir yol değil biliyorum ama bu konuda daha yarın sabah çalışacağız .. Şerefe !!
Aditya Hajare

Ne yazık ki style="display:none"Chrome ile bile <img>örnek bloğunda belirtilen resimleri yüklemeye çalışıyor .
Jesse Glick

0

Anonim yanıtı denedim ve burada küçük bir hile olduğunu gördüm, ters eğik çizgiden sonra bir boşluk varsa işe yaramaz \
Yani aşağıdaki çözüm işe yaramaz -

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

Ancak alan kaldırıldığında işe yarıyor -

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

alert(x.test);​

Umarım yardımcı olur !!


7
bir ters eğik çizgiden sonra bir boşluğunuz varsa, ters eğik çizgi boşluktan kaçar. Uzaydan değil, linebreak'den kaçması gerekiyordu.
Sejanus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.