2011-02-23 134 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