可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have a page with a list of links and a div which serves as a placeholder for the pages the links lead to. Everytime user clicks on a link an iframe is created in the div and its src attribute gets the value of the link href attribute - simple and clear, sort of external web pages gallery.
What i do have a problem with is printing the contents of the iframe. To do this i use this code:
function PrintIframe()
{
frames["name"].focus();
frames["name"].print();
}
The issue seems to be that iframe is created dynamically by JQuery - when I insert an iframe right into the html code, the browser prints the external page all right. But with the same code injected by JavaScript nothing happens. I tried to use JQ 1.3 'live' event on "Print" link, no success. Is there a way to overcome this?
回答1:
Suppose that this is what your iframe looks like:
<iframe id='print-iframe' name='print-frame-name'></iframe>
This is how you do it using jQuery:
$("#print-iframe").get(0).contentWindow.print();
and this is how you do it using native JavaScript:
document.getElementById("print-iframe").contentWindow.print();
回答2:
I've had an issue with printing iframe's content. In order to achive this, use code below:
For example you have iframe:
<iframe id='print-iframe' name='print-iframe'></iframe>
Then js to print iframe's content call this function (works both in ie and other browsers):
printIframe('print-iframe');
Function's code:
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();
}
}
回答3:
I tried this and was able to replicate the issue. What i noticed was that when calling the print function the iframe hadn't completed loaded. i tested this by checking the value of innerHTML when calling PrintIFrame(). To overcome this, you can use setTimeOut to call the function again x milliseconds later:
function PrintIframe() {
if (window.frames['myname'].innerHTML != "") {
window.frames['myname'].focus();
window.frames['myname'].print();
} else {
setTimeout(PrintIframe,1000);
}
}
This worked for me
EDIT
Strange - i had an alert in my test code which seems to make it work. When i took it out, it didn't work. Sorry :(
Anyway, this should do it using jQuery to attach a load event handler to the iframe. I have tested on IE8 and it works:
<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>
回答4:
Hmm do I get this right? You only need to change the source of where the IFrame leads to?
$("#iframe").attr("src", "http://www.example.com");
回答5:
Maybe the same-domain restriction prevents your JavaScript from executing. The same-domain restriction allows JavaScript in frame A (or the main window) to interact (such as .print()) with frame B if A and B are from the same domain. Check your JavaScript error console. If you get something like a security exception / permission error, then it is most probably because of the same-domain restriction.
回答6:
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();
}
回答7:
I found this searching the web
$('#preview-iframe').contents().find('html').html(data);
and changed it to
$('#preview-iframe').contents().find('html').html(data).after(function() {
document.getElementById("preview-iframe").contentWindow.print();
});
twigstechtips
回答8:
I know this is a pretty old thread but I have a more rubust solution for this.
It's based on
https://stackoverflow.com/a/9648159/3183069 and https://stackoverflow.com/a/831547/3183069
I added .one() function so it doesnt loop infinitely if you cancel the print!
I also load the iframe once. Enjoy
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" />
回答9:
This is a pretty old thread but I found one working solution for this.
I added sleep in jquery so it doesn't print empty window, it requires few second to reload the newly replaced content.
$('#printiframe').attr('src', pdf_file_path);
setTimeout(function () {
$("#printiframe").get(0).contentWindow.print();
}, 500);