2009-05-06 86 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" />