2008-10-23 6 views
54

J'ai une page qui est censée lancer la page d'aperçu avant impression.Comment Print Preview peut-il être appelé à partir de Javascript?

Je trouve ceci:

var OLECMDID = 7; 
/* OLECMDID values: 
* 6 - print 
* 7 - print preview 
* 1 - open window 
* 4 - Save As 
*/ 
var PROMPT = 1; // 2 DONTPROMPTUSER 
var WebBrowser = '<OBJECT ID="WebBrowser1" WIDTH=0 HEIGHT=0 CLASSID="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"></OBJECT>'; 
document.body.insertAdjacentHTML('beforeEnd', WebBrowser); 
WebBrowser1.ExecWB(OLECMDID, PROMPT); 
WebBrowser1.outerHTML = ""; 

Mais ...

  1. il ne fonctionne pas dans FireFox.
  2. c'est plutôt moche.

Existe-t-il un meilleur moyen pour IE ou un moyen qui fonctionne pour FireFox?

Répondre

34

Vous ne pouvez pas, Aperçu avant impression est une fonctionnalité d'un navigateur, et devrait donc être protégé contre l'appel par JavaScript car il y aurait un risque de sécurité.

C'est pourquoi votre exemple utilise Active X, qui contourne les problèmes de sécurité JavaScript. A la place, utilisez la feuille de style d'impression que vous devriez déjà avoir et montrez-la pour media = screen, print au lieu de media = print.

Lire Alist Apart: Going to Print pour un bon article sur le sujet des feuilles de style d'impression.

+5

L'article sur ALA a été déplacé: http://www.alistapart.com/articles/goingtoprint/ – Roman

+0

@Thomas J'ai mis à jour le lien. – alex

+1

Bien que ce soit un bon article, il n'aborde pas son problème. Nous avons un client qui ne veut pas apprendre à ses utilisateurs à appuyer sur Ctrl + P ou Fichier -> Imprimer afin qu'ils veulent un bouton d'impression sur l'écran. – knight0323

18

Je pense que le mieux possible dans JavaScript JavaScript multi-navigateur est window.print(), ce qui (dans Firefox 3, pour moi) affiche la boîte de dialogue 'imprimer' et non la boîte de dialogue d'aperçu avant impression.

3

Cela peut être fait en utilisant javascript. Dites votre code html/ASPX va dans ce sens:

<span>Main heading</span> 
<asp:Label ID="lbl1" runat="server" Text="Contents"></asp:Label> 
<asp:Label Text="Contractor Name" ID="lblCont" runat="server"></asp:Label> 
<div id="forPrintPreview"> 
    <asp:Label Text="Company Name" runat="server"></asp:Label> 
    <asp:GridView runat="server"> 

     //GridView Content goes here 

    </asp:GridView 
</div> 

<input type="button" onclick="PrintPreview();" value="Print Preview" /> 

Ici, sur un clic de bouton « Aperçu avant impression » nous allons ouvrir une fenêtre avec des données pour l'impression. Notez que 'forPrintPreview' est l'identifiant d'un div. La fonction pour Aperçu avant impression va dans ce sens:

function PrintPreview() { 
var Contractor= $('span[id*="lblCont"]').html(); 
printWindow = window.open("", "", "location=1,status=1,scrollbars=1,width=650,height=600"); 
printWindow.document.write('<html><head>'); 
printWindow.document.write('<style type="text/css">@media print{.no-print, .no-print *{display: none !important;}</style>'); 
printWindow.document.write('</head><body>'); 
printWindow.document.write('<div style="width:100%;text-align:right">'); 

    //Print and cancel button 
printWindow.document.write('<input type="button" id="btnPrint" value="Print" class="no-print" style="width:100px" onclick="window.print()" />'); 
printWindow.document.write('<input type="button" id="btnCancel" value="Cancel" class="no-print" style="width:100px" onclick="window.close()" />'); 

printWindow.document.write('</div>'); 

//You can include any data this way. 
printWindow.document.write('<table><tr><td>Contractor name:'+ Contractor +'</td></tr>you can include any info here</table'); 

printWindow.document.write(document.getElementById('forPrintPreview').innerHTML); 
//here 'forPrintPreview' is the id of the 'div' in current page(aspx). 
printWindow.document.write('</body></html>'); 
printWindow.document.close(); 
printWindow.focus(); 
} 

Observons que les boutons « print » et « annuler » a la classe css « non-print », donc ces boutons ne pas apparaître dans la presse écrite.

Questions connexes