Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Передача параметра с кавычкой внутри. (https://javascript.ru/forum/events/33462-peredacha-parametra-s-kavychkojj-vnutri.html)

zebra741258963 24.11.2012 05:43

Передача параметра с кавычкой внутри.
 
Добрый день.
Есть короткий код:
Код:

<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' ???

danik.js 24.11.2012 11:59

Цитата:

Сообщение от zebra741258963 (Сообщение 217559)
JavaScript пытается перевести мою строку в код и перестаёт работать как будто я пытаюсь передать 'SAMS'UNG' ???

Не javascript! А HTML!

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

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

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

?

zebra741258963 24.11.2012 21:11

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

Так что получается кроме экранирования кавычек я должен знать и экранировать ещё десяток параметров типа &QU0T; &#O39; (как минимум 4 варианта для одинарных и двойных кавычек), а далее может всплыть что и ещё какие-то?

danik.js 24.11.2012 22:10

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

Сначала ведь работает html-парсер, верно? Он ведь производит разбор исходника. И он ведь споткнется если встретит attr="blabla"blabla", верно? html-парсеру до фени как экранируются кавычки в js.

zebra741258963 25.11.2012 02:47

В том-то и дело что я считал что HTML вторичен, так как он язык разметки и должен отвечать за отображение. А для этого страница вначале должна быть создана (в том числе и средствами JavaScript).
Если вы специалитс, может подскажете что я должен экранировать перед передачей параметров в JavaScript для полной безопасности?

danik.js 25.11.2012 07:09

Повторюсь: экранирование производится для парсера. В память и объекты попадают уже разэкранированные парсером значения. Создавая из JS атрибут элемента, не нужно в нем экранировать кавычку через '

zebra741258963 29.11.2012 17:02

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

Так что я до сих пор не знаю какие ещё символы/строки я не могу подставлять в свою функцию вместо фразы SAMS UNG
:(

zebra741258963 29.11.2012 18:18

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

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

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

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

zebra741258963 06.12.2012 01:56

Неужели никто не знает? :(

Маэстро 07.12.2012 13:15

Цитата:

Сообщение от zebra741258963 (Сообщение 218690)
Там может быть любая фраза которую впишет пользователь... К примеру:
<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Артаньян, соответственно, поиск "Д'Артаньян" ничего не найдет.

danik.js 07.12.2012 13:20

Да, это один из принципов ( MVC ? ) - экранирование должно происходить непосредственно перед выводом. А хранилище данных не должно знать об особенностях Представления. Ибо представлением может быть вывод и в html и в xml и в json и хрен знает во что еще (pdf, xsl, etc)


Часовой пояс GMT +3, время: 02:10.