Конец цитаты в 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, &quot;.

Ответ 2

&quot; будет работать в этом конкретном случае, как было предложено передо мной, из-за контекста 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 &quot;Mini&quot;'); 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 использует три аргумента вместо одного. &nbsp; - неразрывный пробельный символ. Даже если это не вся проблема, это может быть хорошей идеей.

Ответ 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, '\\');
}