Как я могу рендерить встроенный JavaScript с помощью Jade / Pug?


222

Я пытаюсь заставить JavaScript отображаться на моей странице, используя Jade (http://jade-lang.com/)

Мой проект находится в NodeJS с Express, все работает правильно, пока я не хочу написать несколько встроенных JavaScript в голове. Даже если взять примеры из Jade Docs, я не могу заставить его работать, что мне не хватает?

Нефритовый шаблон

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

Результирующий визуализированный HTML в браузере

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

Что-то определенно не хватает здесь каких-либо идей?


3
Вы пропустили точку .после(type='text/javascript')
Warface

1
!!! 5устарела, вы должны использоватьdoctype html
Joaquinglezsantos

Ответы:


369

просто используйте тег «script» с точкой после.

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

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


Хорошее решение, но оно будет производить только <script>вместо <script type="text/javascript">.
Войто

47
type="text/javascript"значение по умолчанию для typeполя в <script>тегах. Вам не нужно устанавливать это.
Адам Фабицки

Как насчет многострочного кода? Есть ли способ иметь правильный отступ кода в моем Javascript, когда встроен в Jade таким образом?
фактор

6
Политика Jade изменилась, теперь тег встроенного скрипта должен иметь .добавление. Итак, script.следом за вашим отступом блок JS.
Joeytwiddle

4
Этот пример - уязвимость внедрения скрипта. См. Github.com/visionmedia/jade/issues/1474
Джейсон Меррилл

104

:javascriptФильтр был удален в версии 7.0

В документах говорят , вы должны использовать scriptтег теперь, после чего .полукокса и без предшествующего пространства.

Пример:

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

будет скомпилировано в

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

Сценарий тега с точкой после, во всем блоке javascript есть ли способ, чтобы сделать его без перевода строки?
Joaquinglezsantos

@Joaquinglez не то, что я знаю
Фелипе Сабино

55

Используйте тег script с указанным типом, просто добавьте его перед точкой:

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

Это скомпилируется в:

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

1
просто script.было бы хорошо.
NoobTW

24

Не используйте только тег скрипта.

Решение с |:

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

Или с .:

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

6
Я рекомендую .. В противном случае вам придется писать |в каждой строке.
Ильяс

2

Третья версия моего ответа:

Вот многострочный пример встроенного Jade Javascript. Я не думаю, что вы можете написать это без использования -. Это пример флеш-сообщения, который я использую в частичном. Надеюсь это поможет!

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

Код, который вы пытаетесь получить, чтобы скомпилировать код в вашем вопросе?

Если это так, вам не нужны две вещи: во-первых, вам не нужно объявлять, что это Javascript / скрипт, вы можете просто начать писать код после ввода текста -; во-вторых, после ввода-if вам не нужно вводить {ни то, }ни другое. Вот что делает Джейд очень милой.

-------------- ОРИГИНАЛЬНЫЙ ОТВЕТ НИЖЕ ---------------

Попробуйте предваряя ifс -:

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

Есть также множество примеров Jade на:

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


Спасибо, Джон использовал это для нечетной единственной строки, однако я не вижу возможности сделать несколько строк без добавления «-». Домашняя страница Jade ( ссылка даже содержит пример того, что я пытаюсь сделать, но она не скомпилируется. Я тоже использую последний выпуск.
JMWhittaker

Итак, вы спрашиваете, как сделать несколько строк кода Javascript ниже одной, если?
Джон Аллен

@ Синие же здесь, я никогда не заставлял это работать. Вы должны задать вопросы по GitHub.
Марк

Марк, теперь перешел к использованию Эко Сэма Стивенсона вместо Джейд. Я использовал только Jade в качестве быстрого интерфейса для тестирования.
JMWhittaker

Jade 0.12.4 позволяет мне использовать script (), не добавляя JS - ниже.
Ричард Холланд

1

Для многострочного контента Jade обычно использует «|», однако:

Теги, которые принимают только текст, такой как скрипт, стиль и текстовая область, не нуждаются в ведущей | персонаж

Тем не менее, я не могу воспроизвести проблему, которую вы имеете. Когда я вставляю этот код в шаблон Jade, он выдает правильный вывод и выдает предупреждение при загрузке страницы.


0

Используйте :javascriptфильтр. Это сгенерирует тег сценария и экранирует содержимое сценария как CDATA:

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

@aaaidan Ты прав. Он поддерживается Scalate (я использую его здесь без проблем: github.com/cb372/phone-home/blob/master/src/main/webapp/WEB-INF/… ), но, похоже, чистый Jade не поддержите это, поскольку это не перечислено здесь: github.com/visionmedia/jade#features . Это позор!
Крис Б.

Да, было бы хорошо. Как гласит верхний ответ, он script.работает нормально и законно!!! 5
aaaidan

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

//- Workaround
<script nonce="some-nonce">console.log("test");</script>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.