Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.11.2012, 05:43
Аспирант
Отправить личное сообщение для zebra741258963 Посмотреть профиль Найти все сообщения от zebra741258963
 
Регистрация: 13.12.2011
Сообщений: 67

Передача параметра с кавычкой внутри.
Добрый день.
Есть короткий код:
Код:
<a style=cursor:pointer onClick="x('SAMS UNG')">НажмиТУТ</a>
<input id=PoleText>

<script>
function x(Stroka){document.getElementById('PoleText').value=Stroka}
</script>
Всё просто:
Есть строчка НажмиТУТ и текстовое поле. При нажатии на строку выполняется событие onClick, которое вызывает функцию x, которая помещает в текстовое поле передаваемый параметр.
Вроде всё работает.

Может я не прав, но мне кажется я правильно расставил необходимые кавычки:
- одинарные обязаны окоймлять строковую переменную
- и саму функцию вставил в двойные кавычки, так как иначе встретив первый пробел он являлся бы концом действия по onClick

В этой ситуации недопустимо чтобы в строке была бы одинарная или двойная кавычка (так как любая из них испортит код), и я понимаю что если она появится то я её должен экранировать.

Но непонятый для меня момент появился если я среди прочего должен передавать последовательность символов &##039; (естественно с одним символом #, просто если я тут его поставлю одинарным, то сайт отобразит само значение), например вместо 'SAMS UNG' надо в функции передать строку 'SAMS&##039;UNG'.

Да, ASCI символ номер 39 - это одинарная кавычка. Но я же не передаю кавычку, я передаю строку содержащую код который HTML может отобразить в виде кавычки (и то не всегда). В реальной жизни он даже отображаться не будет. Но почему если я попытаюсь передать 'SAMS&##039;UNG' - JavaScript пытается перевести мою строку в код и перестаёт работать как будто я пытаюсь передать 'SAMS'UNG' ???
Ответить с цитированием
  #2 (permalink)  
Старый 24.11.2012, 11:59
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от zebra741258963 Посмотреть сообщение
JavaScript пытается перевести мою строку в код и перестаёт работать как будто я пытаюсь передать 'SAMS'UNG' ???
Не javascript! А HTML!

Спецификация гласит, что значение атрибутов, содержащее пробелы, должно быть в кавычках. Если в значении атрибута нужно передать саму кавычку, то нужно использовать такую хрень - &#O39;

Так что javascript тут не причем - он получает уже готовый символ кавычки. Не приходило в голову написать например

<a title="Привет &#O39;кавычка&#O39;!">Наведи на меня</a>

?
Ответить с цитированием
  #3 (permalink)  
Старый 24.11.2012, 21:11
Аспирант
Отправить личное сообщение для zebra741258963 Посмотреть профиль Найти все сообщения от zebra741258963
 
Регистрация: 13.12.2011
Сообщений: 67

Я-то какраз считал наоборот, что HTML будет превращать &#O39; в кавычку лишь на этапе отображения данных (как в твоём примере). И что если мне надо передать кавычку в значение атрибута - я должен её экранировать как \' или \" а не через коды &#O39;

Так что получается кроме экранирования кавычек я должен знать и экранировать ещё десяток параметров типа &QU0T; &#O39; (как минимум 4 варианта для одинарных и двойных кавычек), а далее может всплыть что и ещё какие-то?
Ответить с цитированием
  #4 (permalink)  
Старый 24.11.2012, 22:10
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Экранировать ты должен по правилам той "среды", где тебе нужно указать символ. Если ты пишешь кавычку в "среде" html, то ты должен ее экранировать по правилам html. В этом и есть смысл экранирования.

Сначала ведь работает html-парсер, верно? Он ведь производит разбор исходника. И он ведь споткнется если встретит attr="blabla"blabla", верно? html-парсеру до фени как экранируются кавычки в js.
Ответить с цитированием
  #5 (permalink)  
Старый 25.11.2012, 02:47
Аспирант
Отправить личное сообщение для zebra741258963 Посмотреть профиль Найти все сообщения от zebra741258963
 
Регистрация: 13.12.2011
Сообщений: 67

В том-то и дело что я считал что HTML вторичен, так как он язык разметки и должен отвечать за отображение. А для этого страница вначале должна быть создана (в том числе и средствами JavaScript).
Если вы специалитс, может подскажете что я должен экранировать перед передачей параметров в JavaScript для полной безопасности?
Ответить с цитированием
  #6 (permalink)  
Старый 25.11.2012, 07:09
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Повторюсь: экранирование производится для парсера. В память и объекты попадают уже разэкранированные парсером значения. Создавая из JS атрибут элемента, не нужно в нем экранировать кавычку через '
Ответить с цитированием
  #7 (permalink)  
Старый 29.11.2012, 17:02
Аспирант
Отправить личное сообщение для zebra741258963 Посмотреть профиль Найти все сообщения от zebra741258963
 
Регистрация: 13.12.2011
Сообщений: 67

У меня есть строка:
<a style=cursor:pointer onClick="x('SAMS UNG')">НажмиТУТ</a>
Если вместо - SAMS UNG будет стоять одинарная кавычка (опостроф) - скрипт работать не будет!
Если вместо - SAMS UNG будет стоять двойная кавычка (") - скрипт работать не будет!
Если вместо - SAMS UNG будет стоять код &#O39; - скрипт работать не будет!
При этом если вместо - SAMS UNG будет стоять код &qu0t; - скрипт работать будет (хотя разэкранировав он даёт двойную кавычку, которая нарушила бы работу скрипта)

Так что я до сих пор не знаю какие ещё символы/строки я не могу подставлять в свою функцию вместо фразы SAMS UNG
Ответить с цитированием
  #8 (permalink)  
Старый 29.11.2012, 18:18
Аспирант
Отправить личное сообщение для zebra741258963 Посмотреть профиль Найти все сообщения от zebra741258963
 
Регистрация: 13.12.2011
Сообщений: 67

Там может быть любая фраза которую впишет пользователь... К примеру:
<a onClick="x('Мама мыла раму')">Мама мыла раму</a>

и таких несколько сот строк.
Я просто не понимаю как я должен парсить текст чтобы недопустить ошибки.

На данный момент на момент ввода я:
1) Заменяю все символы "<" на &lt;
2) Удаляю одинарную и двойную кавычку, а также
&#0З4;
&#0З9;
&quоt;
&аpos;

я понимаю что коды \u0027 и \u0022 какраз в этом случае полностью безопасны.
А что ещё надо удалять?

Последний раз редактировалось zebra741258963, 06.12.2012 в 01:56.
Ответить с цитированием
  #9 (permalink)  
Старый 06.12.2012, 01:56
Аспирант
Отправить личное сообщение для zebra741258963 Посмотреть профиль Найти все сообщения от zebra741258963
 
Регистрация: 13.12.2011
Сообщений: 67

Неужели никто не знает?
Ответить с цитированием
  #10 (permalink)  
Старый 07.12.2012, 13:15
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Сообщение от zebra741258963 Посмотреть сообщение
Там может быть любая фраза которую впишет пользователь... К примеру:
<a onClick="x('Мама мыла раму')">Мама мыла раму</a>

и таких несколько сот строк.
Я просто не понимаю как я должен парсить текст чтобы недопустить ошибки.

На данный момент на момент ввода я:
1) Заменяю все символы "<" на &lt;
2) Удаляю одинарную и двойную кавычку, а также
&#0З4;
&#0З9;
&quоt;
&аpos;

я понимаю что коды \u0027 и \u0022 какраз в этом случае полностью безопасны.
А что ещё надо удалять?
1. Не повторяйте в html-коде одну и ту же текстовую строку два раза. Во-первых, это избыточно, во-вторых, имеете те проблемы, которые имеете. Любую строку можно получить в javascript-переменную не передавая её в виде параметра js-функции, а вынимая текст из html-элемента:
<html>
<body> 
<script>
function x(o)
{
var s = o.innerHTML;  
alert(s);  
};
</script>

<a onClick=x(this)>Мама ' мыла " раму - &#034 - &#039 </a>
</body>
</html>

2. "На данный момент на момент ввода я ... Заменяю все символы..."
Это плохо. После таких замен Вы столкнетесь с последующей проблемой хранения данных в базе данных и поиска по ней. А Вы же храните строки в базе? Например, слово Д'Артаньян в базе сохранится как Д&#039Артаньян, соответственно, поиск "Д'Артаньян" ничего не найдет.
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
drag'n'drop, передача параметра M03G Элементы интерфейса 1 14.08.2012 17:00
Передача this при обращение к объекту внутри класса ugin_root Общие вопросы Javascript 9 14.08.2012 16:26
передача параметра this KpyacH jQuery 12 09.08.2011 20:43
Передача параметра? hatata jQuery 6 14.03.2010 15:12
Передача параметра из checkbox в asp страницу artwalek AJAX и COMET 3 11.08.2009 14:24