当前位置: 首页 > 知识库问答 >
问题:

带引号的Thymeleaf内联javascript不起作用

司空朝
2023-03-14

我有一个使用Thymeleaf的Spring启动应用程序。我正在使用字符串值设置一个模型变量,并希望在javascript中将其用作变量值。

在Java中,我执行以下操作:

StringBuffer data = new StringBuffer();
data.append("[ [\"").append(name1).append("\" ], \"").append(name2).append("\"] ] ");
...
model.addAttribute("dataString", data);

我的HTML代码如下所示:

<script th:inline="javascript">
  /*<![CDATA[*/
  var dataSet = [[${dataString}]];
  /*]]>*/
...
</script>

JavaScript中的结果应该是:

var dataSet = [ ["Name1"], ["Name2"] ];

但是我得到的是超文本标记语言:

var dataSet = "[ [\"Name1\"], [\"Name2\"] ]";

我在超文本标记语言/JavaScript中尝试了不同的东西:

  • 仅使用一个括号[$dataString]-

JavaScript中没有正确的字符串。我怎样才能获得正确的字符串?

共有1个答案

元昊苍
2023-03-14

您不应该将JSON字符串从控制器传递到模型。相反,您应该传递常规Java对象,并让Thymeleaf为您进行编码。例如,如果您想要一个如下所示的数据集:

[ ["Name1"], ["Name2"] ]

然后,应将其添加到模型中,如下所示:

// This is an array of arrays, just like [ ["Name1"], ["Name2"] ]
String[][] dataset = {{"Name1"}, {"Name2"}};
model.addAttribute("dataString", dataset);

然后的输出

<script th:inline="javascript">
  /*<![CDATA[*/
  var dataSet = [[${dataString}]];
  /*]]>*/
</script>

将导致JavaScript:

var dataSet = [ ["Name1"], ["Name2"] ];

正如您所希望的,无需手动创建字符串。这当然适用于所有类型的Java对象,甚至可以将getter和setter自动转换为常规JavaScript对象。

当然,如果您真的只想直接从您的模型中添加JSON字符串,您当然可以使用未转义的内联。

var dataSet = [(${dataString})];

但这确实与这些东西的工作原理背道而驰。

 类似资料:
  • POM 应用程序 控制器 此外,我有模板文件夹中的资源文件夹和内部错误。html和index.html 当我访问localhost:8080/index时,会显示错误,而不是索引。我做错了什么?这真的是最简单的设置,它已经错了。。。

  • 我有一个springboot项目,需要呈现脚本元素的一部分,如下所示。(假设函数是在其他地方定义的。) 预期产出: 其中是Spring模型属性。 是否可以使整个在一个Thymeleaf表达式中?或者,将和分配给单独的JavaScript变量,然后将它们连接起来是唯一的方法吗?我尝试了以下内容,但似乎内联的JavaScript表达式总是被引用。 实际产出: 顺便说一下,我使用的是Thymeleaf2

  • 使用SpringMVC和Thymeleaf,我正在构建一个包含一些javascript的html视图。 在页面中,th: each与迭代值一起使用,为一组按钮提供唯一的超文本标记语言id。 我的问题出现在尝试生成javascript时,该javascript将对每个按钮id使用jQuery引用。 在另一种视图解析语言中,我会使用代码: (以上可能不是100%语法正确,但我希望你明白——我试图做的是

  • 我正在Spring MVC项目中使用Thymeleaf。我需要使用作为查询字符串的一部分提供的id动态构建数据url。我正在使用JQuery上载插件上载所附的文档。 这是必需的输出(对于给定的查询字符串serverId=10) 这是Thymeleaf代码 我也尝试了一些变化,但是将th: inline移动到父标签,并尝试了th: inline的no和javascript值。我尝试过的其他变体是 这

  • 问题内容: 之间有什么区别 和 我注意到当我不使用引号时,您不能在密钥中使用。但这实际上有区别吗?如果是的话,哪个? 问题答案: 不,引号不会有任何区别(除非如您所述,除非您想使用不是有效JavaScript标识符的键)。 作为一个侧面说明,JSON数据交换格式确实需要标识周围的双引号(和它不会让单引号)。

  • 问题内容: 说我有以下代码 我希望它在IE8中显示内联。我到处阅读的所有内容都说这应该可行,IE8支持内联块。但是,经过一个上午的尝试,我无法获得上述排队。我知道我可以浮动它,但要使用页面上的其他元素(此处未显示),我需要使用一个“ clearfix”,其标记更多。我只需要针对IE8,很想知道为什么内联块对我显然不起作用,但对我来说却不起作用。在Google Chrome浏览器中,上面的代码可以实