Использование document.implementation.createDocument для создания нового HTML-документа - PullRequest
1 голос
/ 02 февраля 2012

Мне передают HTML как строку.Моя цель состоит в том, чтобы создать новый документ из html, который имеет все соответствующие узлы, чтобы я мог делать такие вещи, как вызов doc.getElementsByTagName в создаваемом мной документе, и заставить его работать как положено.Пример моего кода приведен здесь.

var doc = window.document.implementation.createDocument
    ('http://www.w3.org/1999/xhtml', 'html',  null);
doc.getElementsByTagName('html')[0].innerHTML =
      '<head><script>somejs</script>' +
      '<script>var x = 5; var y = 2; var foo = x + y;</script>' +
      '</head><body></body>';
var scripts = doc.getElementsByTagName('script');
console.log(scripts[0] + " code = " + scripts[0].innerHTML);

У меня возникают следующие проблемы:

  1. Если что-то внутри тега скрипта содержит символ типа <(например, в приведенном выше примерев операторе "var foo = x + y;" измените символ + на символ <), я получаю исключение INVALID_STATE_ERR: DOM 11. </li>
  2. Даже если в теге скрипта ничего не используются такие символы, при запускевышеупомянутый я получаю вывод "[элемент объекта] code = undefined"

Итак, мои вопросы:

A.Как мне работать с такими символами, как <, которые создают исключение DOM 11, когда я пытаюсь использовать их во всем, что я устанавливаю innerHTML на B. Как мне заставить документ правильно анализировать теги сценария и помещать их код в их атрибут innerHTML так, чтобыПозже я смогу прочитать его. </p>

РЕДАКТИРОВАТЬ: Как отметил Райан П., этот код на самом деле работает в FF.Так что, если кто-нибудь сможет помочь мне заставить его работать в Chrome, это будет очень ценно!

Ответы [ 2 ]

4 голосов
/ 12 января 2013

взято с https://github.com/rails/turbolinks, почему вы не пытаетесь создать документ таким образом:

doc = document.implementation.createHTMLDocument("");
doc.open("replace");
doc.write(html);
doc.close();

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

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

A. Вам нужно преобразовать любой <в HTML-сущность (& lt;). Правила не перестают применяться только потому, что вы находитесь в теге скрипта. </p>

B. Вы называете свою переменную «doc», но пытаетесь получить теги сценария из неопределенной переменной «tempDoc». Когда я запускаю ваш код в своем браузере после изменения этой переменной, кажется, все работает нормально.

...