2011-02-23 99 views
1

我有一个iframe用于从其父页面生成PDF。 PDF制造商(ABCpdf)需要一个HTML文件,然后转换。从iframe刮去父页html

我目前做的是使用刮家长的HTML:

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

然后我用的形式在iframe将其提交给在那里按摩是之前删除之类的iframe部分服务器保存为PDF制造商的临时HTML文件。

但是生成的HTML代码是错位的,与<BODY>代替<body>等,并围绕ID的引号去掉等

有没有更好的办法来获取HTML?

我不只是以HTML格式重新生成页面的原因是父页面是一个复杂的报表。它包含各种控件,以允许用户显示/隐藏表格中的各个部分或排序。所以我得到的HTML必须反映用户定制。

感谢

+0

我已经几乎完全做你与ABCPdf描述了。我最终需要做的是创建一个页面外观的自定义JSON标记,然后使用该信息重新生成页面。我知道这是一种痛苦,但它也给你一些灵活性来做一些事情,比如添加自定义页眉或页脚。 – roto 2011-02-23 19:12:36

回答

1

正如大卫所说,使用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); 
1

访问一个页面的DOM和连载到HTML会得到任何方式的浏览器在乎它序列化到数据。就规格而言,大写标签名称和省略属性值的可选引号都没有问题。

如果您想要原始源代码,您需要使用XHR发出HTTP请求以使其更新。

+0

我不想要原始来源。我想要用户定制的源代码。谢谢 – derekcohen 2011-02-23 17:46:49

+0

您正在获取用户定制的源代码。浏览器不会**旨在尽可能地为您提供类似于原始代码风格的内容......或者完全可以。 – Quentin 2011-02-23 20:09:19