Я пытаюсь передать значение моей функции javascript, но этот вызов функции зависит от логической переменной. У меня это работало нормально, пока я недавно не обновился до безопасности тимелеафа 5.
Это фрагмент кода.
<body th:onload = "${timerEnabled} ? 'javascript:runTimer(\'' + ${timeRemaining} + '\');'">
timerEnabled должен быть истинным, чтобы вызов функции был выполнен, но теперь тимелеаф выдает исключение как
org.thymeleaf.exceptions.TemplateProcessingException: Only variable expressions returning numbers or booleans are allowed in this context, any other datatypes are not trusted in the context of this expression, including Strings or any other object that could be rendered as a text literal. A typical case is HTML attributes for event handlers (e.g. "onload"), in which textual data from variables should better be output to "data-*" attributes and then read from the event handler.
Как я могу это решить? Спасибо.
Потому что это приложение с весенней загрузкой, и я только что обновил его до версии 2.0.6. Может, мне и не нужно было его помечать. Думал, это поспособствует.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я смог заставить его работать, используя этот подход
<body>
<script th:inline = "javascript">
/*<![CDATA[*/
var flag = [[${timerEnabled}]]; // if timer should be included or not
var timeRemaining = [[${timeRemaining}]]; // the time remaining.
window.onload = function() {
if (!flag)
return; // Exit/Return if the variable is false
runTimer(timeRemaining); // Call your favourite method if the variable is true
};
/*]]>*/
</script>
Приветствуется любой другой подход, такой как предложенный в исключении.
Попробуйте так.
<body th:onload = "${timerEnabled eq true} ? 'javascript:runTimer(\'' + ${timeRemaining} + '\');'">
Если это не сработает, вы также можете попробовать использовать th:if.
<th:block th:if = "${timerEnabled} eq true">
<body th:onload = "javascript:runTimer(\'' + ${timeRemaining} + '\');'">
</body>
</th:block>
<th:block th:if = "${timerEnabled} eq false">
<body></body>
</th:block>
Я знаю, другая версия выглядит намного лучше, но, поскольку она не работает, эта не так уж и плоха. Конечно, в данном случае я бы не рекомендовал добавлять его в качестве предвестника.
Что мне кажется странным, так это то, что я пробую ваш код, он действительно работает на моей стороне. Кто знает, почему вы получаете эту ошибку.
Я только что попробовал ваш фрагмент кода, но он не работает. Я понял, что проблема в том, что переменная "String" передается функции javascript в обработчике (onload). Я начал получать эту ошибку после обновления, и, возможно, это связано с обновлением. github.com/thymeleaf/thymeleaf/issues/705
Даже тот, который использует th:if? Я попробовал их оба, и они сработали. Это должно быть обновление, но это довольно странно.
Тот, который находится в if, также дает ошибку, но требует, чтобы у меня было содержимое в двух отдельных блоках. Я думаю, это из-за обновления, и они сделали его строгим режимом, чтобы не разрешать передачу строк непосредственно в дескрипторы в соответствии с исключением. Но опять же, большое спасибо, потому что я узнал кое-что новое из вашего ответа.
Начиная с Thymeleaf 3.0.10 они исправили ошибку безопасности, касающуюся неэкранированного кода.
Пытаться
<body th:onload = "[[${timerEnabled}]] ? 'javascript:runTimer(\'' +
[[${timeRemaining}]] + '\');'">
Или рекомендуемый способ:
<body th:data1 = "${timerEnabled}"
th:data2 = "${timeRemaining}"
th:onload = "this.getAttribute('data1') ? javascript:runTimer(this.getAttribute('data2'));">
Чтобы узнать больше: https://github.com/thymeleaf/thymeleaf/issues/707 А также: http://forum.thymeleaf.org/Thymeleaf-3-0-10-JUST-PUBLISHED-tt4031348.html#a4031353
Вы имеете в виду первый пример или второй? И что вы имеете в виду под любой определенной версией тимелиста по состоянию на 2019 год?
Я могу подтвердить, что это работает! Использование новейшего тимелеафа на 2019 год. Это намного лучше и чище, чем метод th:inline javascript, в котором вы используете CDATA, как и в другом упомянутом ответе.
Почему он помечен
spring-boot?