Scalatag生成HTML还是Javascript?

Scalatag生成HTML还是Javascript?,javascript,scala,scalatags,Javascript,Scala,Scalatags,我看到一些Scala代码生成HTML def pagePlay: TypedTag[dom.raw.HTMLElement] = div{ val levels = Array( (10, "Easy game; you are allowed 10 misses."), (5, "Medium game; you are allowed 5 misses."), (3, "Hard game; you are allowed 3 misses."

我看到一些Scala代码生成HTML

  def pagePlay: TypedTag[dom.raw.HTMLElement] = div{
    val levels = Array(
      (10, "Easy game; you are allowed 10 misses."),
      (5, "Medium game; you are allowed 5 misses."),
      (3, "Hard game; you are allowed 3 misses.")
    )
    div(
      p("Inspired from ")(a(href:="http://www.yiiframework.com/demos/hangman/", target:="_blank","Yii's demo")),
      p("This is the game of Hangman. You must guess a word, a letter at a time.\n" +
        "If you make too many mistakes, you lose the game!"),
      form(id := "playForm")(
        for((level,text) <- levels) yield {
          val levelId = s"level_${level}"
          div(`class`:="radio")(
            input(id:=levelId, `type`:="radio", name:="level", onclick:={ ()=>
              Model.level() = level
            }, {if(level == Model.level()) checked:="checked"}),
            label(`for`:=levelId, style:="padding-left: 5px")(text)
          )
        }, br,
        input(`type`:="button", value:="Play!", `class`:="btn btn-primary", onclick:={ () =>
          if(Model.level() > 0) {
            Model.start()
            goto(pageGuess)
          }else{
            dom.alert("Please select level!")
          }
        })
      )
    )
  }
def pagePlay:TypedTag[dom.raw.HTMLElement]=div{
val级别=数组(
(10,“简单游戏;你可以错过10次。”),
(5,“中等游戏;您可以错过5次。”),
(3,“艰苦的比赛;你可以错过3次。”)
)
div(
p(“灵感来源”)(a(href:=”http://www.yiiframework.com/demos/hangman/,目标:=“_blank”,“Yii的演示”),
p(“这是刽子手的游戏。你必须一次猜一个单词,一个字母。\n”+
“如果你犯了太多的错误,你就会输掉比赛!”,
表格(id:=“播放表格”)(
对于((级别,文本)
Model.level()=级别
},{如果选中(level==Model.level()):=“选中”}),
标签(`for`:=levelId,style:=“padding left:5px”)(文本)
)
},br,
输入(`type`:=“button”,value:=“Play!”,`class`:=“btn btn primary”,onclick:={()=>
如果(Model.level()>0){
Model.start()
转到(页面猜测)
}否则{
通知(“请选择级别!”)
}
})
)
)
}
^这个ScalaTag代码实际上是在生成一个简单的web爬虫可以在不支持javascript的情况下读取的HTML,还是在生成修改DOM以生成div和段落之类的javascript


我试着阅读文档,但是对于div和p,除了“Pattern:div:Tags.this.ConcreteHtmlTag[html.div]”之外,没有别的东西了。

它同时使用了这两种语言,至少现在它使用了:

从文档中:

Although Scalatags was originally a HTML-String generation library, it now
ships with an additional backend that runs only on ScalaJS.
此外:

DOM后端提供了一个附加的方法。在所有Scalatags片段上呈现,该方法将片段转换为DOM树:

如您所见,您可以直接操作DOM元素,调用标准的DOM API,如.children、.appendChild等,正如您所知,这些都是Javascript


它同时使用这两种方法,至少现在是这样:

从文档中:

Although Scalatags was originally a HTML-String generation library, it now
ships with an additional backend that runs only on ScalaJS.
此外:

DOM后端提供了一个附加的方法。在所有Scalatags片段上呈现,该方法将片段转换为DOM树:

如您所见,您可以直接操作DOM元素,调用标准的DOM API,如.children、.appendChild等,正如您所知,这些都是Javascript


您可以将其转换为字符串,并在Play的模板引擎中呈现。如果要生成HTML,应
导入scalatag.Text.all.\u
。如果希望它只生成JavaScriptDOM元素,那么可以使用
import scalatags.JsDom.all.
,就像您在上面的示例中所做的那样。虽然理论上可以对由
JsDom
生成的DOM元素调用
.innerHTML
,但不应该这样做:这样做会清除事件侦听器和其他属性。此外,
JsDom
在Scala JVM服务器上不起作用。所以您应该使用scalatags.Text。如果您想在两者之间共享代码,有一些文档说明了如何做到这一点,您可以将其转换为字符串,并在Play的模板引擎中呈现。如果您想生成HTML,您应该
导入scalatag.Text.all.\u
。如果希望它只生成JavaScriptDOM元素,那么可以使用
import scalatags.JsDom.all.
,就像您在上面的示例中所做的那样。虽然理论上可以对由
JsDom
生成的DOM元素调用
.innerHTML
,但不应该这样做:这样做会清除事件侦听器和其他属性。此外,
JsDom
在Scala JVM服务器上不起作用。所以您应该使用scalatags.Text。如果您想在两者之间共享代码,那么有一些关于如何实现共享的文档