Wie kann ich Inline-JavaScript mit Jade / Pug rendern?


222

Ich versuche, JavaScript mithilfe von Jade (http://jade-lang.com/) auf meiner Seite zum Rendern zu bringen.

Mein Projekt ist in NodeJS mit Express, alles funktioniert korrekt, bis ich etwas Inline-JavaScript in den Kopf schreiben möchte. Selbst wenn ich die Beispiele aus den Jade-Dokumenten nehme, kann ich es nicht zum Laufen bringen. Was fehlt mir?

Jade Vorlage

!!! 5
html(lang="en")
  head
    title "Test"
    script(type='text/javascript')
      if (10 == 10) {
        alert("working")
      }
  body

Resultierendes gerendertes HTML im Browser

<!DOCTYPE html>
<html lang="en">
<head>
  <title>"Test"</title>
  <script type="text/javascript">
    <if>(10 == 10) {<alert working></alert></if>}
  </script>
</head>
<body>
</body>
</html>

Irgendwelche definitiv ein Fehlschlag hier irgendwelche Ideen?


3
Sie vermissen einen Punkt .nach dem(type='text/javascript')
— Warface

1
!!! 5ist veraltet, müssen Sie verwendendoctype html
— Joaquinglezsantos

Antworten:


369

Verwenden Sie einfach ein 'Skript'-Tag mit einem Punkt danach.

script.
  var users = !{JSON.stringify(users).replace(/<\//g, "<\\/")}

https://github.com/pugjs/pug/blob/master/examples/dynamicscript.pug


Gute Lösung, aber es wird nur <script>statt produzieren <script type="text/javascript">.
— Vojto

47
type="text/javascript"ist der Standardwert für das typeFeld für <script>Tags. Sie müssen es nicht einstellen.
— Adam Fabicki

Was ist mit mehrzeiligem Code? Gibt es eine Möglichkeit, einen korrekten Codeeinzug in mein Javascript zu integrieren, wenn es auf diese Weise in Jade eingebettet ist?
— fehlender Faktor

6
Jades Richtlinie wurde geändert. Das Inline-Skript-Tag sollte jetzt .angehängt sein. Also script.gefolgt von Ihrem eingerückten JS-Block.
— Joeytwiddle

4
Dieses Beispiel ist eine Sicherheitsanfälligkeit bezüglich Skriptinjektion. Siehe github.com/visionmedia/jade/issues/1474
— Jason Merrill

104

Der :javascriptFilter wurde in Version 7.0 entfernt

In den Dokumenten wird angegeben, dass Sie scriptjetzt ein Tag verwenden sollten, gefolgt von einem .Zeichen und keinem vorangestellten Leerzeichen.

Beispiel:

script.
  if (usingJade)
    console.log('you are awesome')
  else
    console.log('use jade')

wird zu kompiliert

<script>
  if (usingJade)
    console.log('you are awesome')
  else
    console.log('use jade')
</script>

Tag-Skript mit einem Punkt nach, gibt es in allen Javascript-Blöcken eine Möglichkeit, es ohne Zeilenumbrüche zu rendern?
— Joaquinglezsantos

@ Joaquinglez nicht, dass ich weiß
— Felipe Sabino

55

Verwenden Sie ein Skript-Tag mit dem angegebenen Typ. Fügen Sie es einfach vor dem Punkt ein:

script(type="text/javascript").
  if (10 == 10) {
    alert("working");
  }

Dies wird kompiliert zu:

<script type="text/javascript">
  if (10 == 10) {
    alert("working");
  }
</script>

1
nur script.wäre in Ordnung.
— NoobTW

24

Kein Skript-Tag verwenden.

Lösung mit |:

script
  | if (10 == 10) {
  |   alert("working")
  | }

Oder mit einem .:

script.
  if (10 == 10) {
    alert("working")
  }

6
Ich empfehle .. Andernfalls müssten Sie |in jede Zeile schreiben .
— Ilyas Karim

2

DRITTE VERSION MEINER ANTWORT:

Hier ist ein mehrzeiliges Beispiel für Inline-Jade-Javascript. Ich glaube nicht, dass man es schreiben kann, ohne a zu verwenden -. Dies ist ein Beispiel für eine Flash-Nachricht, das ich teilweise verwende. Hoffe das hilft!

-if(typeof(info) !== 'undefined')
  -if (info)
    - if(info.length){
      ul
        -info.forEach(function(info){
          li= info
      -})
  -}

Ist der Code, den Sie erhalten möchten, um den Code in Ihrer Frage zu kompilieren?

Wenn ja, brauchen Sie nicht zwei Dinge: Erstens müssen Sie nicht deklarieren, dass es sich um Javascript / ein Skript handelt. Sie können einfach nach der Eingabe mit dem Codieren beginnen -. Zweitens müssen -ifSie nach der Eingabe nicht das {oder eingeben } auch nicht . Das macht Jade ziemlich süß.

-------------- ORIGINAL ANTWORT UNTEN ---------------

Versuchen Sie das Voranstellen ifmit -:

-if(10 == 10)
  //do whatever you want here as long as it's indented two spaces from
   the `-` above

Es gibt auch Tonnen von Jade-Beispielen bei:

https://github.com/visionmedia/jade/blob/master/examples/


Danke John hat das für die ungerade einzelne Zeile verwendet, aber ich kann sowieso nicht sehen, dass mehrere Zeilen ausgeführt werden, ohne dass das '-' vorangestellt wird. Die Jade-Homepage ( Link enthält sogar ein Beispiel dafür, was ich versuche, aber es wird nicht kompiliert. Ich verwende auch die neueste Version.
— JMWhittaker

Sie fragen sich also, wie Sie mehrere Zeilen Javascript-Code unter einer Zeile haben sollen, wenn?
— JohnAllen

@Bluey gleich hier, ich habe das nie zum Laufen gebracht. Sie sollten zu den Github-Fragen fragen.
— Markieren Sie

Mark, habe jetzt Sam Stephensons Eco anstelle von Jade verwendet. Ich habe Jade nur als schnelle Benutzeroberfläche zum Testen verwendet.
— JMWhittaker

Mit Jade 0.12.4 kann ich ein Skript () erstellen, ohne dem JS - darunter voranzustellen.
— Richard Holland

1

Für mehrzeiligen Inhalt verwendet Jade normalerweise ein "|":

Tags, die nur Text wie Skript, Stil und Textbereich akzeptieren, benötigen nicht das führende | Charakter

Das heißt, ich kann das Problem, das Sie haben, nicht reproduzieren. Wenn ich diesen Code in eine Jade-Vorlage einfüge, wird die richtige Ausgabe erstellt und beim Laden der Seite eine Warnung angezeigt.


0

Verwenden Sie den :javascriptFilter. Dadurch wird ein Skript-Tag generiert und der Skriptinhalt als CDATA maskiert:

!!! 5
html(lang="en")
  head
    title "Test"
    :javascript
      if (10 == 10) {
        alert("working")
      }
  body

@aaaidan Du hast recht. Es wird von Scalate unterstützt (ich verwende es hier ohne Probleme: github.com/cb372/phone-home/blob/master/src/main/webapp/WEB-INF/… ), aber es sieht so aus, als ob reine Jade dies nicht tut Unterstützen Sie es, da es hier nicht aufgeführt ist: github.com/visionmedia/jade#features . Das ist eine Schande!
— Chris B

Ja, wäre schön gewesen. Wie die Top-Antwort sagt, script.funktioniert ein gut und ist legal!!! 5
— aaaidan

0
script(nonce="some-nonce").
  console.log("test");

//- Workaround
<script nonce="some-nonce">console.log("test");</script>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.