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

Я пытаюсь передать значение моей функции 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. 

Как я могу это решить? Спасибо.

Почему он помечен spring-boot?

Boris 22.10.2018 17:41

Потому что это приложение с весенней загрузкой, и я только что обновил его до версии 2.0.6. Может, мне и не нужно было его помечать. Думал, это поспособствует.

Knight Rider 22.10.2018 18:18
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
21
2
9 315
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я смог заставить его работать, используя этот подход

<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

Knight Rider 23.10.2018 02:07

Даже тот, который использует th:if? Я попробовал их оба, и они сработали. Это должно быть обновление, но это довольно странно.

Alain Cruz 23.10.2018 02:15

Тот, который находится в if, также дает ошибку, но требует, чтобы у меня было содержимое в двух отдельных блоках. Я думаю, это из-за обновления, и они сделали его строгим режимом, чтобы не разрешать передачу строк непосредственно в дескрипторы в соответствии с исключением. Но опять же, большое спасибо, потому что я узнал кое-что новое из вашего ответа.

Knight Rider 23.10.2018 02:53

Начиная с 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 год?

leome 03.05.2019 14:42

Я могу подтвердить, что это работает! Использование новейшего тимелеафа на 2019 год. Это намного лучше и чище, чем метод th:inline javascript, в котором вы используете CDATA, как и в другом упомянутом ответе.

rahmatns 05.09.2019 05:57

Другие вопросы по теме