web-dev-qa-db-fra.com

Comment imprimer un fichier IFrame à partir de javascript dans Safari/Chrome

Quelqu'un peut-il m'aider s'il vous plaît à imprimer le contenu d'un IFrame via un appel javascript dans Safari/Chrome.

Cela fonctionne dans Firefox:

$('#' + id)[0].focus();
$('#' + id)[0].contentWindow.print();

cela fonctionne dans IE:

window.frames[id].focus();
window.frames[id].print();

Mais je ne peux rien faire fonctionner dans Safari/Chrome.

Merci

Andrew

50
Andrew Bullock

Mettez une fonction d'impression dans l'iframe et appelez-la à partir du parent.

iframe:

function printMe() {
  window.print()
}

parent:

document.frame1.printMe()

voici ma solution complète, multi-navigateur:

dans la page iframe:

function printPage() { print(); }

dans la page principale

function printIframe(id)
{
    var iframe = document.frames ? document.frames[id] : document.getElementById(id);
    var ifWin = iframe.contentWindow || iframe;
    iframe.focus();
    ifWin.printPage();
    return false;
}

Update : De nombreuses personnes semblent avoir des problèmes avec cela dans les versions de IE publiées depuis que j'ai ce problème. Je n'ai pas le temps de ré-enquêter maintenant, si vous êtes coincé, je vous suggère de lire tous les commentaires dans ce fil!

48
Andrew Bullock

J'ai utilisé le script d'Andrew mais j'ai ajouté un élément avant que la fonction printPage () soit appelée. L'iframe doit être activé, sinon, le cadre parent sera toujours imprimé dans IE.

function printIframe(id)
{
    var iframe = document.frames ? document.frames[id] : document.getElementById(id);
    var ifWin = iframe.contentWindow || iframe;
    iframe.focus();
    ifWin.printPage();
    return false;
}

Ne me remercie pas, c'est Andrew qui a écrit ça. Je viens de faire un Tweak = P

32
M.W. Felker

En plus des solutions d'Andrew et Max, l'utilisation de iframe.focus () a abouti à l'impression du cadre parent au lieu d'imprimer uniquement un iframe enfant dans IE8. Changer cette ligne l'a corrigé:

function printIframe(id)
{
    var iframe = document.frames ? document.frames[id] : document.getElementById(id);
    var ifWin = iframe.contentWindow || iframe;
    ifWin.focus();
    ifWin.printPage();
    return false;
}
8
serdar

Utilisez firefox window.frames mais ajoutez également la propriété name car elle utilise iframe dans firefox

C'EST À DIRE: 

window.frames[id]

Firefox:

window.frames[name]

<img src="print.gif"  onClick="javascript: window.frames['factura'].focus(); parent['factura'].print();">
<iframe src="factura.html" width="100%" height="400" id="factura" name="factura"></iframe>
4
Luis Garcia

J'ai dû faire quelques modifications pour pouvoir le faire avec IE8 (je n'ai pas testé avec d'autres saveurs IE)

1) document.frames [param] semble accepter un nombre, pas un identifiant

printIframe(0, 'print');

function printIframe(num, id)
{
  var iframe = document.frames ? document.frames[num] : document.getElementById(id);
  var ifWin = iframe.contentWindow || iframe;

  ifWin.focus();
  ifWin.printPage();

  return false;
}

2) Une boîte de dialogue d'impression était affichée au chargement de la page et il y avait également un lien vers "Cliquez ici pour lancer l'impression" (si elle ne démarre pas automatiquement). Pour que cela fonctionne, je devais ajouter focus () call

<script type="text/javascript">
  $(function(){
    printPage();
  });

  function printPage()
  {
    focus();
    print();
  }
</script>
3
Yura Omelchuk

Une chose à noter est que si vous testez cela localement en utilisant file: ///, cela ne fonctionnera pas sur chrome car la fonction dans iframe apparaîtra comme non définie. Cependant, une fois sur un serveur Web, cela fonctionnera.

3
Blake Hancock

Vous pouvez utiliser  

parent.frames['id'].print();

Travailler chez Chrome!

0
Rogerio de Moraes

Le 'framePartsList.contentWindow.print ();' ne fonctionnait pas dans IE 11 ver11.0.43

J'ai donc utilisé FramePartsList.contentWindow.document.execCommand ('print', false, null);

0
Imran Khan Hunzai

Vous pouvez aussi utiliser 

top.iframeName.print();

ou

parent.iframeName.print();
0
LENG UNG