我有一个 iframe,用于从其父页面生成 PDF。 PDF 生成器 (ABCpdf) 需要一个 HTML 文件,然后将其转换。
我目前所做的是使用以下方法抓取父级的 HTML:
var temp;
temp=parent.document.body.parentNode.innerHTML;
然后我使用 iframe 中的表单将其提交到服务器,在服务器中删除 iframe 部分等内容,然后将其保存为 PDF 制作者的临时 HTML 文件。
然而,生成的 HTML 代码被破坏,用
<BODY>
代替 <body>
等,并且删除了 ID 周围的引号等。
有更好的方法来获取 HTML 吗?
我不只是将页面重新生成为 HTML 的原因是父页面是一个复杂的报告。它包含各种控件,允许用户显示/隐藏部分或对表中的行进行排序。所以我得到的 HTML 必须反映用户的自定义。
谢谢
正如 David 提到的,使用
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);
访问页面的 DOM 并序列化为 HTML 将以浏览器想要序列化的任何方式获取数据。就规范而言,大写标签名称并省略属性值周围的可选引号是可以的。
如果您想要原始来源,则需要使用 XHR 发出 HTTP 请求以获取最新信息。