2010-08-18 92 views
0

我有一個div,我想寫入一個彈出窗口(打印)。如何修改jQuery html()方法的返回值?

我使用jQuery的HTML抓住div的我想在頁面上的內容()函數,就像這樣:

function printOptions() { 
     var printwindow = window.open('', 'Report', 'height=600,width=600'); 
     printwindow.document.write('<html><head><title>Report</title>'); 
     printwindow.document.write('</head><body>'); 
     printwindow.document.write($('#ReportHeader').html()); 
     printwindow.document.write($('#ReportData').html()); 
     printwindow.document.write('</body></html>'); 
     printwindow.document.close(); 
     printwindow.print(); 
     return true; 
    } 

不過,在我document.write()的該#ReportHeader的內容, #ReportData div,我想稍微改變它們。

具體而言,我想用包含該文本框值的簡單跨度替換所有文本框。

喜歡的東西:

$("input[type=text]").each(function() { 
    $(this).replaceWith("<span>" + $(this).val() + "</span>"); 
}); 

我如何能做到這一點,以不改變我現有的網頁這些div的只是內容?我只想修改我將要寫入打印窗口的內容。我不認爲我可以選擇html()返回的內容,因爲它只是返回一個字符串。

我不希望修改正在啓動彈出窗口的原始頁面。只是我要寫入彈出窗口的內容。

有關我如何做到這一點的任何想法?

回答

1

您可以使用.clone()做有效,如下所示:

printwindow.document.write(
    $('#ReportHeader').clone().find("input[type=text").each(function() { 
    $(this).replaceWith("<span>" + $(this).val() + "</span>"); 
    }).end().html() 
); 

這會得到原始#ReportHeader及其子級的副本,以便您可以在不修改原始內容的情況下操縱它們,以及不會花費HTML字符串 - >節點轉換的花費,而這種轉換的代價相當昂貴。

+0

+1 - 這是比我的回答更明確的語義。 – 2010-08-18 20:59:47

+0

我閱讀了關於end()的文檔,但我不確定我是否理解這一點。結束點()是什麼?謝謝btw! – KingNestor 2010-08-18 21:02:46

+0

@KingNestor -'.end()'將鏈接回克隆,否則您將爲輸入元素獲取'.html(),而不是整個'#ReportHeader'元素,因此無論何時一個遍歷語句可以改變你正在使用的元素(比如'.find()'),它會在變化發生之前使鏈回到處理元素的狀態。 – 2010-08-18 21:08:40

0

你可以通過常規的jQuery選擇器和修飾符來做任何你想要的div。

var $reportHeader = $($('#ReportHeader').html()); 

// Remove some div 
$reportHeader.find('div.to_remove').remove(); 

// Now use $reportHeader.html() to add the modified contents to printwindow 
0

以取代靜態span元素的所有輸入,你可以做這樣的事情。(未測試)

$(":input").each(function() { 
    var parent = $(this).parent(); 
    var val = $(this).val(); 
    $(parent).remove($(this).append("<span>" + $(this).val() + "</span>")); 
});