Передача параметра с кавычкой внутри.
Добрый день.
Есть короткий код: Код:
<a style=cursor:pointer onClick="x('SAMS UNG')">НажмиТУТ</a> Есть строчка НажмиТУТ и текстовое поле. При нажатии на строку выполняется событие onClick, которое вызывает функцию x, которая помещает в текстовое поле передаваемый параметр. Вроде всё работает. Может я не прав, но мне кажется я правильно расставил необходимые кавычки: - одинарные обязаны окоймлять строковую переменную - и саму функцию вставил в двойные кавычки, так как иначе встретив первый пробел он являлся бы концом действия по onClick В этой ситуации недопустимо чтобы в строке была бы одинарная или двойная кавычка (так как любая из них испортит код), и я понимаю что если она появится то я её должен экранировать. Но непонятый для меня момент появился если я среди прочего должен передавать последовательность символов &##039; (естественно с одним символом #, просто если я тут его поставлю одинарным, то сайт отобразит само значение), например вместо 'SAMS UNG' надо в функции передать строку 'SAMS&##039;UNG'. Да, ASCI символ номер 39 - это одинарная кавычка. Но я же не передаю кавычку, я передаю строку содержащую код который HTML может отобразить в виде кавычки (и то не всегда). В реальной жизни он даже отображаться не будет. Но почему если я попытаюсь передать 'SAMS&##039;UNG' - JavaScript пытается перевести мою строку в код и перестаёт работать как будто я пытаюсь передать 'SAMS'UNG' ??? |
Цитата:
Спецификация гласит, что значение атрибутов, содержащее пробелы, должно быть в кавычках. Если в значении атрибута нужно передать саму кавычку, то нужно использовать такую хрень - &#O39; Так что javascript тут не причем - он получает уже готовый символ кавычки. Не приходило в голову написать например <a title="Привет &#O39;кавычка&#O39;!">Наведи на меня</a> ? |
Я-то какраз считал наоборот, что HTML будет превращать &#O39; в кавычку лишь на этапе отображения данных (как в твоём примере). И что если мне надо передать кавычку в значение атрибута - я должен её экранировать как \' или \" а не через коды &#O39;
Так что получается кроме экранирования кавычек я должен знать и экранировать ещё десяток параметров типа &QU0T; &#O39; (как минимум 4 варианта для одинарных и двойных кавычек), а далее может всплыть что и ещё какие-то? |
Экранировать ты должен по правилам той "среды", где тебе нужно указать символ. Если ты пишешь кавычку в "среде" html, то ты должен ее экранировать по правилам html. В этом и есть смысл экранирования.
Сначала ведь работает html-парсер, верно? Он ведь производит разбор исходника. И он ведь споткнется если встретит attr="blabla"blabla", верно? html-парсеру до фени как экранируются кавычки в js. |
В том-то и дело что я считал что HTML вторичен, так как он язык разметки и должен отвечать за отображение. А для этого страница вначале должна быть создана (в том числе и средствами JavaScript).
Если вы специалитс, может подскажете что я должен экранировать перед передачей параметров в JavaScript для полной безопасности? |
Повторюсь: экранирование производится для парсера. В память и объекты попадают уже разэкранированные парсером значения. Создавая из JS атрибут элемента, не нужно в нем экранировать кавычку через '
|
У меня есть строка:
<a style=cursor:pointer onClick="x('SAMS UNG')">НажмиТУТ</a>Если вместо - SAMS UNG будет стоять одинарная кавычка (опостроф) - скрипт работать не будет! Если вместо - SAMS UNG будет стоять двойная кавычка (") - скрипт работать не будет! Если вместо - SAMS UNG будет стоять код &#O39; - скрипт работать не будет! При этом если вместо - SAMS UNG будет стоять код &qu0t; - скрипт работать будет (хотя разэкранировав он даёт двойную кавычку, которая нарушила бы работу скрипта) Так что я до сих пор не знаю какие ещё символы/строки я не могу подставлять в свою функцию вместо фразы SAMS UNG :( |
Там может быть любая фраза которую впишет пользователь... К примеру:
<a onClick="x('Мама мыла раму')">Мама мыла раму</a> и таких несколько сот строк. Я просто не понимаю как я должен парсить текст чтобы недопустить ошибки. На данный момент на момент ввода я: 1) Заменяю все символы "<" на < 2) Удаляю одинарную и двойную кавычку, а также �З4; �З9; &quоt; &аpos; я понимаю что коды \u0027 и \u0022 какраз в этом случае полностью безопасны. А что ещё надо удалять? |
Неужели никто не знает? :(
|
Цитата:
<html> <body> <script> function x(o) { var s = o.innerHTML; alert(s); }; </script> <a onClick=x(this)>Мама ' мыла " раму - " - ' </a> </body> </html> 2. "На данный момент на момент ввода я ... Заменяю все символы..." Это плохо. После таких замен Вы столкнетесь с последующей проблемой хранения данных в базе данных и поиска по ней. А Вы же храните строки в базе? Например, слово Д'Артаньян в базе сохранится как Д'Артаньян, соответственно, поиск "Д'Артаньян" ничего не найдет. |
Да, это один из принципов ( MVC ? ) - экранирование должно происходить непосредственно перед выводом. А хранилище данных не должно знать об особенностях Представления. Ибо представлением может быть вывод и в html и в xml и в json и хрен знает во что еще (pdf, xsl, etc)
|
Часовой пояс GMT +3, время: 02:10. |