Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> onchange="функция(параметр_С_КАВЫЧКАМИ)", Экранировать кавычки в параметре? 
:(
    Опции темы
Cyclone
Дата 25.3.2010, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 2.5.2007

Репутация: нет
Всего: нет



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

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

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

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

Подскажите, пожалуйста, решение.
Спасибо.
PM MAIL   Вверх
skyboy
Дата 25.3.2010, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



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

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

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

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

PM MAIL   Вверх
Cyclone
Дата 25.3.2010, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 2.5.2007

Репутация: нет
Всего: нет



Собственно, экранировать на 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) - тоже не вариант.
PM MAIL   Вверх
skyboy
Дата 25.3.2010, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



Цитата(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 ...>

хотя способ не без недостатков: если кавычки уже были экранированы, то они опять станут "сбойными"
PM MAIL   Вверх
Cyclone
Дата 25.3.2010, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 2.5.2007

Репутация: нет
Всего: нет



Спасибо большое...
Кажется, мне подходит следующий код:
Код

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

PM MAIL   Вверх
skyboy
Дата 25.3.2010, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



пометь вопрос решенным.
PM MAIL   Вверх
Cyclone
Дата 25.3.2010, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 2.5.2007

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) Cyclone - 25.3.2010, 19:35
PM MAIL   Вверх
skyboy
Дата 25.3.2010, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



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

в смысле, без циклов и вызовов фунцкий? а откуда тогда возьмется вставка сторонних данных?
в любом случае, продолжать поиск лучше в разделе JSP. 
PM MAIL   Вверх
IDVsbruck
Дата 26.3.2010, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 778
Регистрация: 12.11.2006

Репутация: 8
Всего: 22



Не согласен. Вопрос по существу. Просто не обязательно выкладывать jsp-код (сам сильно сержусь, когда всовывают в этот раздел ПэХаПэ-код), хотя для понимания дела это все-таки пришлось бы делать. Так что вопрос имеет место быть.
Думаю, твою проблему может решить вынос функции в <script></script> раздел, где не будет таких сложностей с экранированием кавычек. То есть инициализируем переменную, значение которой устанавливается прекомпилятором с помощью JSTL, а дальше в функции работаем с этой переменной. Дальше javascript сам разберется с экранированием. Код предлагать не буду, так как и так все понятно.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1220 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.