Конец цитаты в JavaScript
Я выводя значения из базы данных (она не открыта для публичной записи, но она открыта для входа пользователем в компании, то есть я не беспокоюсь о XSS.)
Я пытаюсь вывести тег следующим образом:
<a href="" onclick="DoEdit('DESCRIPTION');">Click Me</a>
ОПИСАНИЕ - это фактически значение из базы данных, которое выглядит примерно так:
Prelim Assess "Mini" Report
Я пробовал заменять "с помощью", но независимо от того, что я пытаюсь, Firefox продолжает измельчать мой JavaScript-вызов после пробела после слова "Оценка" и вызывает всевозможные проблемы.
Я должен выслать очевидный ответ, но для жизни меня не могу понять.
Кто-нибудь хочет указать на мой идиотизм?
Вот вся HTML-страница (в конце концов это будет страница
Ответы
Ответ 1
Вам нужно избежать строки, которую вы пишете, в DoEdit
, чтобы очистить символы двойной кавычки. Они приводят к тому, что атрибут onclick
HTML закрывается преждевременно.
Использование escape-символа JavaScript \
недостаточно для контекста HTML. Вам нужно заменить двойную кавычку на правильное представление сущности XML, "
.
Ответ 2
"
будет работать в этом конкретном случае, как было предложено передо мной, из-за контекста HTML.
Однако, если вы хотите, чтобы ваш JavaScript-код был независимо экранирован для любого контекста, вы могли бы выбрать собственную кодировку JavaScript:
'
становится \x27
"
становится \x22
Итак, ваш onclick станет:
DoEdit('Preliminary Assessment \x22Mini\x22');
Это будет работать, например, также при передаче строки JavaScript в качестве параметра для другого метода JavaScript (alert()
- простой метод тестирования для этого).
Я обращаюсь к вам с вопросом о дублировании Stack Overflow, Как избежать строки внутри кода JavaScript внутри обработчика onClick?.
Ответ 3
<html>
<body>
<a href="#" onclick="DoEdit('Preliminary Assessment "Mini"'); return false;">edit</a>
</body>
</html>
Должен сделать трюк.
Ответ 4
Люди, в JavaScript уже есть функция unescape
, которая делает unescaping для \"
:
<script type="text/javascript">
var str="this is \"good\"";
document.write(unescape(str))
</script>
Ответ 5
Проблема заключается в том, что HTML не распознает escape-символ. Вы можете обойти это, используя одиночные кавычки для атрибута HTML и двойные кавычки для onclick.
<a href="#" onclick='DoEdit("Preliminary Assessment \"Mini\""); return false;'>edit</a>
Ответ 6
Вот как я это делаю, в основном str.replace(/[\""]/g, '\\"')
.
var display = document.getElementById('output');
var str = 'class="whatever-foo__input" id="node-key"';
display.innerHTML = str.replace(/[\""]/g, '\\"');
//will return class=\"whatever-foo__input\" id=\"node-key\"
<span id="output"></span>
Ответ 7
Если вы собираете HTML на Java, вы можете использовать этот класс полезной утилиты от Apache commons-lang, чтобы выполнить все экранирование правильно:
org.apache.commons.lang.StringEscapeUtils
Экраны и ускорения Строки для Java, Java Script, HTML, XML и SQL.
Ответ 8
Я сделал образец с помощью jQuery
var descr = 'test"inside"outside';
$(function(){
$("#div1").append('<a href="#" onclick="DoEdit(descr);">Click Me</a>');
});
function DoEdit(desc)
{
alert ( desc );
}
И это работает в Internet Explorer и Firefox.
Ответ 9
В нижеследующем коде можно найти одиночные кавычки как часть введенной строки, используя регулярное выражение. Он проверяет, является ли введенная пользователем строка разделенной запятой и в то же время она даже ускользает от любой отдельной цитаты, введенной как часть строки. Чтобы избежать одиночной кавычки, просто введите обратную косую черту, за которой следует одна кавычка вроде: \ как часть строки. Я использовал валидатор JQuery для этого примера, который вы можете использовать в соответствии с вашим переводом.
Допустимые строки:
'Hello'
'Hello', 'World'
'Hello', 'Мир'
'Hello', 'World', ''
'It\my world', 'Can \' t наслаждаться этим без меня. ',' Welcome, Guest '
HTML:
<tr>
<td>
<label class="control-label">
String Field:
</label>
<div class="inner-addon right-addon">
<input type="text" id="stringField"
name="stringField"
class="form-control"
autocomplete="off"
data-rule-required="true"
data-msg-required="Cannot be blank."
data-rule-commaSeparatedText="true"
data-msg-commaSeparatedText="Invalid comma separated value(s).">
</div>
</td>
JavaScript:
/**
*
* @param {type} param1
* @param {type} param2
* @param {type} param3
*/
jQuery.validator.addMethod('commaSeparatedText', function(value, element) {
if (value.length === 0) {
return true;
}
var expression = new RegExp("^((')([^\'\\\\]*(?:\\\\.[^\'\\\\])*)[\\w\\s,\\.\\-_\\[\\]\\)\\(]+([^\'\\\\]*(?:\\\\.[^\'\\\\])*)('))(((,)|(,\\s))(')([^\'\\\\]*(?:\\\\.[^\'\\\\])*)[\\w\\s,\\.\\-_\\[\\]\\)\\(]+([^\'\\\\]*(?:\\\\.[^\'\\\\])*)('))*$");
return expression.test(value);
}, 'Invalid comma seperated string values.');
Ответ 10
Выбери пробел. Мне кажется, что Firefox использует три аргумента вместо одного.
- неразрывный пробельный символ. Даже если это не вся проблема, это может быть хорошей идеей.
Ответ 11
Вам нужно избегать цитат с двойной обратной косой чертой.
Это не удается (создается PHP json_encode):
<script>
var jsonString = '[{"key":"my \"value\" "}]';
var parsedJson = JSON.parse(jsonString);
</script>
Это работает:
<script>
var jsonString = '[{"key":"my \\"value\\" "}]';
var parsedJson = JSON.parse(jsonString);
</script>
Ответ 12
Вы можете использовать методы jquery escape() и unescape(). Как ниже,
Побег пользователя (ул); экранировать строку и восстанавливать снова, используя unescape (str_esc);
Ответ 13
Вы можете скопировать эти две функции (перечислены ниже) и использовать их для экранирования/удаления всех кавычек и специальных символов. Вам не нужно использовать jQuery или любую другую библиотеку для этого.
function escape(s) {
return ('' + s)
.replace(/\\/g, '\\\\')
.replace(/\t/g, '\\t')
.replace(/\n/g, '\\n')
.replace(/\u00A0/g, '\\u00A0')
.replace(/&/g, '\\x26')
.replace(/'/g, '\\x27')
.replace(/"/g, '\\x22')
.replace(/</g, '\\x3C')
.replace(/>/g, '\\x3E');
}
function unescape(s) {
s = ('' + s)
.replace(/\\x3E/g, '>')
.replace(/\\x3C/g, '<')
.replace(/\\x22/g, '"')
.replace(/\\x27/g, "'")
.replace(/\\x26/g, '&')
.replace(/\\u00A0/g, '\u00A0')
.replace(/\\n/g, '\n')
.replace(/\\t/g, '\t');
return s.replace(/\\\\/g, '\\');
}