J'ai une page de type de documentation avec un iframe à l'intérieur. J'essaie de remplacer l'impression standard du navigateur (Ctrl + p) pour imprimer le contenu d'un iframe uniquement.
Je sais comment imprimer un contenu iframe à l'aide de javascript:
window.frames['webcontent'].focus();
window.frames['webcontent'].print();
Je sais comment exécuter javascript avant d'imprimer, par exemple. comme décrit ici: Vérifier quand un utilisateur a choisi d'imprimer en javascript
Un conseil?
Merci
Ce n'est pas possible (avec Javascript). Il existe un support expérimental pour les événements d'impression initiés par l'utilisateur dans les navigateurs modernes, mais ceux ne sont pas annulables ("événements simples"), de sorte que toute la page reste imprimée même si vous interjectez du code personnalisé pour imprimer le cadre qui vous intéresse.
Compte tenu de cette limitation, votre meilleur choix est probablement d'offrir aux utilisateurs un gros bouton qui déclenche votre fonction d'impression de cadre personnalisée (voir printContentFrameOnly
ci-dessous, activez-le sans arguments) et en espérant qu'ils utiliseront le bouton au lieu de ctrl-p.
Si serait possible, ce serait le moyen de le faire (basé sur cette réponse ):
// listener is a function, optionally accepting an event and
// a function that prints the entire page
addPrintEventListener = function (listener) {
// IE 5.5+ support and HTML5 standard
if ("onbeforeprint" in window) {
window.addEventListener('beforeprint', listener);
}
// Chrome 9+, Firefox 6+, IE 10+, Opera 12.1+, Safari 5.1+
else if (window.matchMedia) {
var mqList = window.matchMedia("print");
mqList.addListener(function (mql) {
if (mql.matches) listener(); // no standard event anyway
});
}
// Your fallback method, only working for JS initiated printing
// (but the easiest case because there is no need to cancel)
else {
(function (oldPrint) {
window.print = function () {
listener(undefined, oldPrint);
}
})(window.print);
}
}
printContentFrameOnly = function (event) {
if (event) event.preventDefault(); // not going to work
window.frames['webcontent'].focus();
window.frames['webcontent'].print();
}
addPrintEventListener(printContentFrameOnly);
Frère, cela peut être facilement réalisé via CSS: Voir ceJSfiddle: Testé
<style>
@media print{
body * {display:none;}
.toPrint{display:block; border:0; width:100%; min-height:500px}
}
</style>
Soit un fichier HTML soit:
<body>
<h3>I do not want this title Printed</h3>
<p> This paragraph should not be printed</p>
<iframe class="toPrint" src="http://akitech.org"></iframe>
<button onclick="window.print()">Print</button>
</body>
L'idée est de définir le contenu de l'iframe quelque part sur la page et d'imprimer UNIQUEMENT ce contenu en masquant le contenu d'origine.
Cela peut être fait en récupérant le contenu de l'iframe lors du lancement de l'événement Ctrl + P (via JavaScript) et en imprimant uniquement son contenu (via CSS @ type).
Code HTML:
<div id="dummy_content"><!-- Here goes the iframe content, which will be printed --></div>
<div id="content_wrapper">
<div id="current_content">Current Content that the user see<div>
<iframe id="myIframe" src="iframe.html"></iframe>
</div>
Code CSS:
@media screen {
#dummy_content {
display:none; /* hide dummy content when not printing */
}
}
@media print {
#dummy_content {
display:block; /* show dummy content when printing */
}
#content_wrapper {
display:none; /* hide original content when printing */
}
}
Code JavaScript:
var dummyContent = document.getElementById("dummy_content");
function beforePrint() {
var iFrame = document.getElementById("myIframe");
dummyContent.innerHTML = iFrame.contentWindow.document.body.innerHTML; // populate the dummy content (printable) with the iframe content
}
document.onkeydown = function(e) {
if (e.ctrlKey && e.keyCode == 80) {
beforePrint();
}
}
Vous pouvez définir un fichier css à imprimer:
@media print {
* { display: none; }
iframe { display: block; }
}
MODIFIER
Mybad ne l'a pas testé.
* { display: none; } is somehow overwriting all
Mais cela fonctionne comme un charme
http://jsfiddle.net/c4e3H/
@media print {
h1, p{ display: none; }
}
Le seul moyen auquel je puisse penser est de cacher tout le contenu du document, à l'exception de l'iframe, et de l'adapter à l'ensemble du document.
<!DOCTYPE html>
<html>
<head>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<style type="text/css">
body.hide *, body #backdrop
{
display: none !important;
}
body.hide #my_print_iframe, body.hide #backdrop
{
background: white;
position: fixed;
top: 0;
left: 0;
bottom: 0;
right: 0;
border: 0;
width: 100%;
height: 100%;
display: block !important;
}
@media print {
body.hide #backdrop
{
display: none !important;
}
}
</style>
<script>
$(document).on('keydown', function(e){
if (e.keyCode == 80 && ( e.metaKey || e.ctrlKey ) ) {
$("body").addClass('hide');
setTimeout(function(){
$("body").removeClass('hide');
},1000)
}
})
</script>
</head>
<body>
<div>
this is some visible text
</div>
<iframe id="my_print_iframe" src="//example.com"></iframe>
</body>
</html>
J'ai utilisé timeout (méchant je sais) car au moins chrome 38 n'envoie pas l'événement keyup après Ctrl + P
Bonjour, ce code pourrait vous aider.
function PrintElem(elem)
{
Popup($(elem).html());
}
function Popup(data)
{
var mywindow = window.open('', 'printMe', 'height=400,width=600');
mywindow.document.write('<html><head><title>Print Me</title>');
mywindow.document.write('</head><body >');
mywindow.document.write(data);
mywindow.document.write('</body></html>');
mywindow.print();
mywindow.close();
return true;
}
et appelez la fonction PrintElem ('iframe') sur votre page.