Jak mogę renderować wbudowany JavaScript za pomocą Jade / Pug?


222

Próbuję uzyskać JavaScript do renderowania na mojej stronie przy użyciu Jade (http://jade-lang.com/)

Mój projekt jest w NodeJS z Express, wszystko działa poprawnie, dopóki nie chcę napisać wbudowanego JavaScript w głowie. Nawet biorąc przykłady z Jadeitowych dokumentów, nie mogę zmusić go do działania tego, czego mi brakuje?

Szablon Jade

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

Wynikowy renderowany HTML w przeglądarce

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

Coś zdecydowanie brakuje tutaj jakieś pomysły?


3
Brakuje kropki .po(type='text/javascript')
— Warface,

1
!!! 5jest przestarzałe, musisz użyćdoctype html
— Joaquinglezsantos

Odpowiedzi:


369

wystarczy użyć znacznika „script” z kropką po.

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

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


Dobre rozwiązanie, ale przyniesie tylko <script>zamiast <script type="text/javascript">.
— Vojto

47
type="text/javascript"jest wartością domyślną typepola w <script>tagach. Nie musisz tego ustawiać.
— Adam Fabicki,

Co z kodem wielowierszowym? Czy istnieje sposób na prawidłowe wcięcie kodu w moim JavaScript, gdy jest osadzony w Jade w ten sposób?
— missingfaktor

6
Zmieniono zasady Jade, wewnętrzny tag skryptu powinien teraz mieć .dołączony dodatek. Więc script.następnie swojej urozmaiconej bryle JS.
— joeytwiddle

4
Ten przykład dotyczy podatności na wstrzykiwanie skryptu. Zobacz github.com/visionmedia/jade/issues/1474
— Jason Merrill

104

:javascriptFiltracyjny usunięto 7.0

Dokumenty mówią, że powinieneś scriptteraz użyć tagu, po którym następuje .znak bez spacji.

Przykład:

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

zostanie skompilowany do

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

znacznik skryptu z kropką po, czy w całym bloku javascript jest jakiś sposób, który renderuje go bez znaków nowej linii?
— Joaquinglezsantos

@Joaquinglez, że nie wiem
— Felipe Sabino

55

Użyj znacznika skryptu z określonym typem, po prostu dołącz go przed kropką:

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

Spowoduje to kompilację do:

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

1
po prostu script.będzie dobrze.
— NoobTW

24

Nie używaj tylko tagu skryptu.

Rozwiązanie z |:

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

Lub z .:

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

6
Polecam .. W przeciwnym razie będziesz musiał pisać |w każdej linii.
— Ilyas karim

2

TRZECIA WERSJA MOJEJ ODPOWIEDZI:

Oto wielowierszowy przykład wbudowanego Jade Javascript. Nie sądzę, że możesz to napisać bez użycia -. To przykładowy komunikat flash, którego używam częściowo. Mam nadzieję że to pomoże!

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

Czy kod, który próbujesz uzyskać, aby skompilować kod w swoim pytaniu?

Jeśli tak, nie potrzebujesz dwóch rzeczy: po pierwsze, nie musisz deklarować, że jest to JavaScript / skrypt, możesz po prostu zacząć pisać po wpisaniu -; Po drugie, po wpisaniu -ifnie trzeba wpisać {albo }albo. To sprawia, że ​​Jade jest całkiem słodka.

-------------- ORYGINALNA ODPOWIEDŹ PONIŻEJ ---------------

Spróbuj zrobić ifz -:

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

Istnieje również mnóstwo przykładów Jade na:

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


Dzięki John użył tego do nieparzystej pojedynczej linii, ale nie widzę zresztą robienia wielu linii bez uprzedniego wstawienia go za pomocą „-”. Strona główna Jade ( link ma nawet przykład tego, co próbuję zrobić, ale nie można go skompilować. Używam również najnowszej wersji.
— JMWhittaker

Pytasz więc, jak umieścić wiele wierszy kodu JavaScript pod jednym, jeśli?
— JohnAllen

@Bluey to samo tutaj, nigdy nie dostałem tego do pracy. Powinieneś zapytać o kwestie związane z github.
— Mark

Mark, teraz przestawiłem się na używanie Eco Sama Stephensona zamiast Jade. Użyłem jade jako szybkiego interfejsu użytkownika do testowania.
— JMWhittaker

Jade 0.12.4 pozwala mi na tworzenie skryptów () bez uprzedniego przygotowania JS z - poniżej.
— Richard Holland

1

W przypadku treści wieloliniowych jade zwykle używa znaku „|”, jednak:

Tagi, które akceptują tylko tekst, takie jak skrypt, styl i obszar tekstowy, nie potrzebują wiodących | postać

To powiedziawszy, nie mogę odtworzyć twojego problemu. Kiedy wklejam ten kod w szablonie jadeit, generuje on właściwe dane wyjściowe i wyświetla monit o załadowanie strony.


0

Użyj :javascriptfiltra. Spowoduje to wygenerowanie znacznika skryptu i uniknięcie zawartości skryptu jako CDATA:

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

@ aaaidan Masz rację. Obsługuje go Scalate (używam go tutaj bez problemów: github.com/cb372/phone-home/blob/master/src/main/webapp/WEB-INF/… ), ale wygląda na to, że czysty Jade nie ma wesprzyj go, ponieważ nie ma go tutaj: github.com/visionmedia/jade#features . Jaka szkoda!
— Chris B

Tak, byłoby miło. Jak mówi najwyższa odpowiedź, script.działa dobrze i jest legalna!!! 5
— aaaidan

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

//- Workaround
<script nonce="some-nonce">console.log("test");</script>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.