Как я могу HTML кодировать текст, который может иметь HTML-теги без кодирования самих тегов в Javascript - PullRequest
0 голосов
/ 03 февраля 2012

В основном у меня есть текст, который может содержать теги HTML, но также может содержать символы, не закодированные в формате HTML.

var doc = window.document.implementation.createDocument
    ('http://www.w3.org/1999/xhtml', 'html',  null);
var text = '<head><script>somejs</script>' +
      '<script>var x = 7; var y = 5; var foo = x < y;</script>' +
      '</head><body></body>');

Я хочу установить текст для атрибута innerHTML элементов.Если я просто сделаю

doc.getElementsByTagName('html')[0].innerHTML = text;

Это вызовет исключение INVALID_STATE_ERR: DOM 11 из-за знака «меньше» между x и y.

Однако, если я htmlEncode, то текст переменной получится

&lt;head&gt;&lt;script&gt;somejs&lt;/script&gt;&lt;script&gt;var x = 7; var y = 5; var     foo = x &lt; y;&lt;/script&gt;&lt;/head&gt;&lt;body&gt;&lt;/body&gt;

И, таким образом, я теряю все теги, которые нужны мне для того, чтобы элемент вел себя так, как хотелось бы, после того, как его innerHTML был установлен.Есть ли какой-либо стандартный способ htmlencode содержимого всех тегов в строке без кодирования самих тегов?

1 Ответ

0 голосов
/ 03 февраля 2012

Для встроенных сценариев вам нужно экранировать строку </script, за которой следует пробел, > или /, в противном случае она закроет соответствующий открывающий тег .

Таким образом, вместо </script> вы можете использовать <\/script>.Это работает:

var text = '<head><script>somejs<\/script><script>var x = 7; var y = 5; var foo = x < y;<\/script></head><body></body>';
el.innerHTML = text;

Обновление: Теперь, когда вы отредактировали свой вопрос, я вижу, что вы используете XHTML!Это объясняет - innerHTML не работает в XHTML.

...