Unescaping амперсанд символов в JavaScript - PullRequest
4 голосов
/ 14 июля 2011

У меня возникают проблемы с отображением значений, которые содержат экранированные символы (т.е. апострофы хранятся как \', а не ', а скобки: &gt; и &lt;, а не > и <).

Элементы, хранящиеся в моей базе данных, имеют символы (' < >), экранированные к (\' &lt; &gt;), соответственно. Когда я пытаюсь динамически добавить их на страницу с помощью JavaScript, они печатаются в экранированной форме в Firefox, а не возвращаются к своим обычным значениям, как в IE (&lt; выводится в HTML, а не просто <).

<html>
    <head>
        <script type="text/javascript">
         $(document).ready(function() {
            var str = "&gt;";
            $(document.body).html(str);
         });
        </script>
    </head>
    <body>

    </body>
</html>

Я знаю, что если я просто сделаю замену, я смогу печатать правильно, но, делая это, я разрешаю ввод HTML-кода, поэтому я в первую очередь избежал строки.

ДОБАВЛЕНО:

Во-первых, я прошу прощения за ошибки в моем первоначальном посте. После более тщательного изучения, в тех случаях, когда я использую $ (). Html (), строки печатаются правильно. Время, когда они печатаются неправильно, когда я использую код, как показано ниже.

var str = "&gt;";
$('#inputField').val(str);

В этом случае отображается текст «>», а не «>». Что я могу сделать, чтобы это исправить?

Ответы [ 3 ]

13 голосов
/ 14 июля 2011

Вам нужно декодировать их следующим образом:

$('#myText').val($("<div/>").html(str).text());

Демо: http://jsfiddle.net/QUbmK/

Вы также можете переместить часть декодирования в функцию и вызвать ее вместо этого:

function jDecode(str) {
    return $("<div/>").html(str).text();
}

$('#myText').val(jDecode(str));
0 голосов
/ 14 июля 2011

Во-первых, вы не можете запустить код, который вы имеете в своем примере. document.body не готов к манипулированию в теге HEAD. Вы должны запустить это после загрузки документа. Если я помещу ваш код в безопасное место для запуска, он прекрасно работает, как вы можете видеть здесь.

Итак ... в вашей ситуации должно быть что-то большее, чем простой пример, который вы показываете здесь. Вы можете видеть, что ваш простой пример отлично работает здесь, когда код помещен в нужное место:

http://jsfiddle.net/jfriend00/RDSNz/

0 голосов
/ 14 июля 2011

Этого не происходит, по крайней мере, с jQuery. Если вы сделаете это буквально: $(document.body).html('&lt;div&gt;'), вы получите <div>, напечатанное на экране, а не тег div. Если вы делаете что-то, что не указано в вашем вопросе:

либо используйте .text() вместо .html(), либо замените все & на &amp;:

$(document.body).text(str);
$(document.body).html(str.replace(/&/g, '&amp;'))
...