2009-05-06 91 views
15

我有一個包含鏈接和div的頁面,它充當鏈接導致頁面的佔位符。每次用戶點擊一個鏈接時,在div中創建一個iframe,其src屬性獲取鏈接href屬性的值 - 簡單明瞭的外部網頁庫。 我所遇到的問題是打印iframe的內容。要做到這一點,我用這個代碼:從父窗口打印動態創建的iframe的內容

 
function PrintIframe() 
{ 
frames["name"].focus(); 
frames["name"].print(); 
} 

這個問題似乎是iframe要通過JQuery的動態創建的 - 當我插入一個iframe的權利到HTML代碼,瀏覽器打印外部頁面沒事。但是用JavaScript注入的相同代碼沒有任何反應。我試圖在「打印」鏈接上使用JQ 1.3'live'事件,但沒有成功。有沒有辦法解決這個問題?

回答

26

假設這是你的iframe的樣子:

<iframe id='print-iframe' name='print-frame-name'></iframe> 

這是你使用jQuery如何做到這一點:

$("#print-iframe").get(0).contentWindow.print(); 

,這是你如何做到這一點ü唱本地JavaScript:

document.getElementById("print-iframe").contentWindow.print(); 
+4

+ 1 for`contentWindow` – 2012-12-08 20:55:13

0

嗯,我得到這個權利?你只需要改變IFrame導致的來源?

$("#iframe").attr("src", "http://www.example.com"); 
+0

沒有,問題是,我不能在iframe打印頁 - 有是2種選擇: 1)它可以打印它像網頁的一部分(用PrintArea插件) - 但它然後只打印一個頁面,並且iframed頁面的內容沒有被格式化,因爲它應該是。 2)可以打印它作爲一個普通的頁面,但只有iframe標籤沒有動態插入,通過JS,但靜態呈現在HTML中。 – certainlyakey 2009-05-06 19:28:45

0

也許同域限制會阻止您的JavaScript執行。如果A和B來自同一個域,則同一域限制允許框架A(或主窗口)中的JavaScript與框架B進行交互(如.print())。檢查你的JavaScript錯誤控制檯。如果您遇到類似安全異常/權限錯誤的情況,那麼很可能是因爲同一域名限制。

+0

不,我在Firebug中沒有這樣的錯誤...而且,這些頁面都來自同一個域。 – certainlyakey 2009-05-06 19:32:54

7

我試過這個,並能夠複製這個問題。我注意到,當調用print函數時,iframe沒有完成加載。我在調用PrintIFrame()時通過檢查innerHTML的值來測試這一點。爲了克服這個問題,你可以使用的setTimeout再次x毫秒後調用的函數:

function PrintIframe() { 

     if (window.frames['myname'].innerHTML != "") { 
      window.frames['myname'].focus(); 
      window.frames['myname'].print(); 
     } else { 
      setTimeout(PrintIframe,1000); 
     }  
    } 

這爲我工作

編輯 奇怪 - 我曾在我的測試代碼的警告,這似乎使這行得通。當我把它拿出來,它不起作用。對不起:(

無論如何,這應該使用jQuery的負載事件處理程序附加到IFRAME做到這一點我已經在IE8測試和它的工作原理:

<html> 
<head> 
    <script language="javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> 
    <script type="text/javascript"> 
    function loadiFrame(src) 
    { 
     $("#iframeplaceholder").html("<iframe id='myiframe' name='myname' src='" + src + "' />"); 
    } 

    $(function() 
    { 
     $("#printbutton").bind("click", 
      function() { 
       loadiFrame('test.aspx'); 
       $("#myiframe").load( 
        function() { 
         window.frames['myname'].focus(); 
         window.frames['myname'].print(); 
        } 
       ); 
      } 
     ); 
    }); 
    </script>  
</head> 
<body> 
    <input type="button" id="printbutton" value="Load iFrame" /> 
    <div id="iframeplaceholder"></div> 
</body> 
</html> 
+0

不適合我:(再次,它可以用html,但它不會打印iframe,如果它是由JQ本身創建的 – certainlyakey 2009-05-06 21:10:38

+0

那麼你的最後闡述在測試頁上確實爲我工作,應進一步調查... – certainlyakey 2009-05-10 05:59:46

0
var ifrm = document.createElement("iframe"); 
// ifrm.style.display = "none"; 
document.body.appendChild(ifrm); 
setTimeout(function() { 
    $(ifrm).contents().find("body").html("my html content"); 
}, 1); 
ifrm.onload = function() { 
    ifrm.contentWindow.print(); 
} 
0

,我發現這個搜索網頁

$('#preview-iframe').contents().find('html').html(data); 

,並把它改成

$('#preview-iframe').contents().find('html').html(data).after(function() { 
    document.getElementById("preview-iframe").contentWindow.print(); 
}); 

twigstechtips

8

我同一個問題,打印iframe的內容。爲了實現這一目標,下面使用代碼:

例如,你有IFRAME:

<iframe id='print-iframe' name='print-iframe'></iframe> 

然後JS來打印iframe的內容調用這個函數(無論是在IE和其他瀏覽器的工作原理):

printIframe('print-iframe'); 

功能的代碼:

function printIframe(iFrameId) { 
    var ua = window.navigator.userAgent; 
    var msie = ua.indexOf ("MSIE "); 
    var iframe = document.getElementById(printFrameId); 

    if (msie !== 0) { 
     iframe.contentWindow.document.execCommand('print', false, null); 
    } else { 
     iframe.contentWindow.print(); 
    } 
} 
0

我知道這是一個很老的線程,但我有一個更る爲此的胸圍解決方案。

它基於 https://stackoverflow.com/a/9648159/3183069https://stackoverflow.com/a/831547/3183069

我加入。一()函數,所以它不無限循環,如果你取消打印! 我也加載了iframe一次。享受

var $body = $("body"), 
 
    $iframe, 
 
    loadiFrame = function(src) { 
 
    if ($body.children('#full-prog').length == 0) { 
 
     $body.append("<iframe id='full-prog' src='" + src + "' />"); 
 
     $iframe = $("#full-prog"); 
 
     $iframe.one('load', function() { 
 
     $iframe.get(0).contentWindow.print(); 
 
     }); 
 
    } else { 
 
     $iframe.get(0).contentWindow.print(); 
 
    } 
 
    }; 
 

 
$("#printbutton").click(function() { 
 
    loadiFrame('iframe source here'); 
 
});
#full-prog { 
 
    overflow: hidden; 
 
    position: absolute; 
 
    width: 0; 
 
    height: 0; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="button" id="printbutton" value="Load iFrame" />