очистить HTML-код родительской страницы из iframe

У меня есть iframe, который используется для создания PDF-файла с его родительской страницы. Создателю PDF (ABCpdf) требуется файл HTML, который затем преобразуется.

В настоящее время я очищаю HTML-код родителя, используя:

var temp;
temp=parent.document.body.parentNode.innerHTML;

затем я использую форму в iframe, чтобы отправить ее на сервер, где она массируется, чтобы удалить такие вещи, как разделы iframe, перед сохранением в виде временного HTML-файла для создателя PDF.

Однако результирующий HTML-код искажен, с <BODY> вместо <body> и т. д., кавычки вокруг идентификаторов удалены и т. д.

Есть ли лучший способ получить HTML?

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

спасибо


person derekcohen    schedule 23.02.2011    source источник
comment
Мне пришлось сделать почти то же самое, что вы описали с помощью ABCPdf. В итоге мне пришлось создать пользовательскую разметку JSON для того, как выглядит страница, а затем регенерировать страницу, используя эту информацию. Я знаю, что это больно, но это также дает вам некоторую гибкость, например, добавление пользовательских верхних или нижних колонтитулов.   -  person roto    schedule 23.02.2011


Ответы (2)


Как упомянул Дэвид, используя innerHTML, вы в значительной степени зависите от милости браузера. Если вы хотите контролировать сериализацию, вы можете просто пройтись по DOM родительского документа самостоятельно, добавив строковое представление узлов в буфер. Это займет больше времени и потребует больше кода, но приведет к полному контролю над выводом.

Что-то вроде этого (псевдокод):

function serializeAttributes(node, buffer) {
  for (attribute in node.attributes) {
    buffer.append(' ' + attribute.name + '="' + attribute.value + '"');
  }
}

function serializeChildren(node, buffer) {
  for (child in node.childNodes) {
    if (child is a text node) {
      buffer.append(child.value);
    } else if (child is an element) {
      // You can also add checks to avoid going into IFrames, etc.
      serializeElement(child, buffer);
    }
  }
}

function serizalizeElement(node, buffer) {
  buffer.append('<' + node.tagName); 
  serializeAttributes(node, buffer);
  if (node.hasChildren) {
    buffer.append('>');
    serializeChildren(node, buffer);
    buffer.append('</' + node.tagName + '>');
  } else {
    buffer.append('\>');
  }
}

serializeNode(window.parent.document);
person levik    schedule 23.02.2011

Доступ к DOM страницы и сериализация в HTML позволит получить данные в том виде, в котором браузер хочет их сериализовать. Имена тегов в верхнем регистре и отсутствие необязательных кавычек вокруг значений атрибутов — это нормально, если речь идет о спецификации.

Если вам нужен оригинальный источник, вам нужно будет использовать XHR, чтобы сделать HTTP-запрос, чтобы получить его свежим.

person Quentin    schedule 23.02.2011
comment
Мне не нужен первоисточник. Мне нужен настраиваемый пользователем источник. Спасибо - person derekcohen; 23.02.2011
comment
Вы получаете настраиваемый пользователем источник. Браузеры не будут стремиться предоставить вам что-то, что максимально похоже на исходный стиль кода… или вообще. - person Quentin; 23.02.2011