Come posso rendere JavaScript inline con Jade / Pug?


222

Sto cercando di ottenere JavaScript per il rendering sulla mia pagina utilizzando Jade (http://jade-lang.com/)

Il mio progetto è in NodeJS con Express, tutto funziona correttamente fino a quando non voglio scrivere un codice JavaScript incorporato nella testa. Anche prendendo gli esempi dai documenti di Jade non riesco a farlo funzionare cosa mi sto perdendo?

Modello di giada

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

HTML di rendering risultante nel 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>

Qualcosa sicuramente manca qui qualche idea?


3
Ti manca un punto .dopo il(type='text/javascript')
Warface,

1
!!! 5è deprecato, è necessario utilizzaredoctype html
Joaquinglezsantos il

Risposte:


369

usa semplicemente un tag 'script' con un punto dopo.

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

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


Buona soluzione, ma produrrà solo <script>invece di <script type="text/javascript">.
Vojto,

47
type="text/javascript"è il valore predefinito per il typecampo sui <script>tag. Non è necessario impostarlo.
Adam Fabicki,

Che dire del codice multilinea? C'è un modo per avere un rientro del codice corretto nel mio Javascript quando incorporato in Jade in questo modo?
missingfaktor

6
La politica di Jade è cambiata, ora il tag dello script inline dovrebbe essere .aggiunto. Quindi script.seguito dal tuo blocco rientrato di JS.
joeytwiddle,

4
Quell'esempio è una vulnerabilità di iniezione di script. Vedi github.com/visionmedia/jade/issues/1474
Jason Merrill

104

Il :javascriptfiltro è stato rimosso nella versione 7.0

La documentazione dice che dovresti usare un scripttag ora, seguito da un .carattere e senza spazio precedente.

Esempio:

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

sarà compilato in

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

tag script con un punto dopo, in tutto il blocco JavaScript esiste un modo per renderlo senza newline?
Joaquinglezsantos,

@Joaquinglez non che io conosca
Felipe Sabino,

55

Usa il tag script con il tipo specificato, includilo semplicemente prima del punto:

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

Questo compilerà per:

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

1
solo script.andrebbe bene.
NoobTW

24

Non utilizzare solo tag script.

Soluzione con |:

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

O con un .:

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

6
Mi raccomando .. Altrimenti dovresti scrivere |in ogni riga.
Ilyas karim

2

TERZA VERSIONE DELLA MIA RISPOSTA:

Ecco un esempio di più righe di Jade Javascript in linea. Non penso che tu possa scriverlo senza usare a -. Questo è un esempio di messaggio flash che uso in modo parziale. Spero che questo ti aiuti!

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

Il codice che stai cercando di compilare è il codice nella tua domanda?

Se è così, non hai bisogno di due cose: in primo luogo, non è necessario dichiarare che è Javascript / uno script, puoi semplicemente iniziare a scrivere codice dopo aver digitato -; secondo, dopo aver digitato -ifnon è necessario digitare {né l' }uno né l'altro. Questo è ciò che rende Jade piuttosto dolce.

-------------- RISPOSTA ORIGINALE SOTTO ---------------

Prova a effettuare la prepending ifcon -:

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

Ci sono anche tonnellate di esempi di giada a:

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


Grazie John l'ho usato per la singola riga dispari, tuttavia non riesco a vedere comunque di fare più righe senza anteporre con '-'. La homepage (Jade collegamento ha anche un esempio di quello che sto cercando di fare, ma non si compila Sto usando l'ultima versione anche..
JMWhittaker

Quindi stai chiedendo come avere più righe di codice Javascript al di sotto di una se?
John Allen,

@Bluey stesso qui, non l'ho mai fatto funzionare. Dovresti chiedere sui problemi di github.
Segna

Mark, ora sono passati all'utilizzo dell'Eco di Sam Stephenson invece di Jade. Stavo usando jade solo come interfaccia utente rapida per i test.
JMWhittaker,

Jade 0.12.4 mi permette di scrivere () senza anteporre JS con - sotto di esso.
Richard Holland,

1

Per il contenuto multilinea, la giada utilizza normalmente un "|", tuttavia:

I tag che accettano solo testo come script, stile e textarea non hanno bisogno del carattere | carattere

Detto questo, non riesco a riprodurre il problema che stai riscontrando. Quando incollo quel codice in un modello di giada, produce l'output giusto e mi richiede un avviso sul caricamento della pagina.


0

Usa il :javascriptfiltro Ciò genererà un tag di script e sfuggirà al contenuto dello script come CDATA:

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

@aaaidan Hai ragione. È supportato da Scalate (lo sto usando qui senza problemi: github.com/cb372/phone-home/blob/master/src/main/webapp/WEB-INF/… ) ma sembra che Jade puro non lo faccia supportalo perché non è elencato qui: github.com/visionmedia/jade#features . È un peccato!
Chris B,

Sì, sarebbe stato carino. Come dice la risposta in alto, script.funziona benissimo ed è legale!!! 5
aaaidan,

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

//- Workaround
<script nonce="some-nonce">console.log("test");</script>
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.