Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > onchange="функция(параметр_С_КАВЫЧКАМИ)"


Автор: Cyclone 25.3.2010, 16:18
Доброго дня.
На JSP странице имеется <select>.
На событии onchange вызывается функция с параметрами:
Код

<select onchange="actionChanged('${property.name}');">

${property.name} - EL expression. Если оно содержит в себе стоковое значение с кавычками, то функцию вызвать не удаётся.

Различные вариации на тему escape() и encodeURIComponent() в onchange="" вызвать не удаётся.

Подскажите, пожалуйста, решение.
Спасибо.

Автор: skyboy 25.3.2010, 16:33
Цитата(Cyclone @  25.3.2010,  15:18 Найти цитируемый пост)
На JSP странице имеется <select>.

при чем тут javascript?
проблема была бы и в том случае, если бы ты хотел получить html/xml структуру:
Код

<select name="${property.name}">

тебе надо в JSP заэкранировать кавычки в значении property.name(добавить слеш перед кавычками: " -> \")

Автор: Cyclone 25.3.2010, 17:09
Собственно, экранировать на JSP/javascript frontend и пытаюсь.


На мой взгляд проблемы бы не возникло, если бы escape() можно было вызывать в onchange:
Код

<select onchange="actionChanged(escape('${property.name}'));">

Однако такая конструкция не срабатывает.

В плане передачи сторокового параметра с кавычками в принципе работает овт такая некрасивая штука:
Код
<c:forEach var="property" items="${list}">

<script>
    var escapedName = escape('${property.name}');
</script>
...
<select onchange="foo(escapedName);">
...
</c:forEach ...>

Но так как всё это находится в forEach, то есть выполнется для каждого элемента list'а, пришедшего с сервера, в функцию foo() каждый раз попадает одна и та же переменная escapedName (последняя в forEach) - тоже не вариант.

Автор: skyboy 25.3.2010, 17:27
Цитата(Cyclone @  25.3.2010,  16:09 Найти цитируемый пост)
экранировать на JSP/javascript frontend и пытаюсь.

не вали в кучу.
JSP формирует HTML+Javascript код. который отправляется клиенту. и попытки использовать именно javascript обречены на провал, потому как клиент код
Код

<select onchange="actionChanged(escape('это "плохой" код'));">

не обработает как надо - будет ошибка синтаксиса.
и код 
Цитата(Cyclone @  25.3.2010,  16:09 Найти цитируемый пост)
<c:forEach var="property" items="${list}">

<script>
    var escapedName = escape('${property.name}');
</script>
...
<select onchange="foo(escapedName);">
...
</c:forEach ...>

не сработает, если у тебя в property.name будут уже одинарные кавычки. сменил шило на мыло.
потому если и делать что-то, то только в JSP составляющей.
с другой стороны, раздел не тот, и у меня нет опыта работы с JSP.
я так понимаю, должно быть примерно так:
Код

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<c:forEach var="property" items="${list}">
...
<select onchange="foo({$fn:replace(property.name,"\"","\\\"");});">
...
</c:forEach ...>

хотя способ не без недостатков: если кавычки уже были экранированы, то они опять станут "сбойными"

Автор: Cyclone 25.3.2010, 17:46
Спасибо большое...
Кажется, мне подходит следующий код:
Код

<select onchange="foo('${fn:escapeXml(property.name)}');">
 + unescape() в javascript'е самой функции.
Недостатоков на первый взгляд не выявлено.

Автор: skyboy 25.3.2010, 18:13
пометь вопрос решенным.

Автор: Cyclone 25.3.2010, 19:13
Честно говоря, мне верится, что существует более человеческое решение...
Не всегда же есть возможность использовать JSTL.

Автор: skyboy 25.3.2010, 20:39
Цитата(Cyclone @  25.3.2010,  18:13 Найти цитируемый пост)
Не всегда же есть возможность использовать JSTL.

в смысле, без циклов и вызовов фунцкий? а откуда тогда возьмется вставка сторонних данных?
в любом случае, продолжать поиск лучше в разделе JSP. 

Автор: IDVsbruck 26.3.2010, 15:30
Не согласен. Вопрос по существу. Просто не обязательно выкладывать jsp-код (сам сильно сержусь, когда всовывают в этот раздел ПэХаПэ-код), хотя для понимания дела это все-таки пришлось бы делать. Так что вопрос имеет место быть.
Думаю, твою проблему может решить вынос функции в <script></script> раздел, где не будет таких сложностей с экранированием кавычек. То есть инициализируем переменную, значение которой устанавливается прекомпилятором с помощью JSTL, а дальше в функции работаем с этой переменной. Дальше javascript сам разберется с экранированием. Код предлагать не буду, так как и так все понятно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)