6
votes

Problème d'impression Safari avec fenêtre JavaScript.Print ()

J'ai un problème avec impression sur Safari. Mon système est Windows 7 et cette fonction fonctionne bien dans tous les autres navigateurs sauf safari. Voici la situation:

var test = document.getElementById('test');
test.style.background = 'yellow';


1 commentaires

Juste une note (je sais que c'est un commentaire tardif, mais il est applicable à '14). Safari a été interrompu pour Windows de retour dans '12 (lorsque Safari 6 est sorti). Donc, si vous essayez de tester Safari sur Windows, sachez que ce n'est pas représentatif de Safari sur Mac et sachez que de nombreuses fonctionnalités «nouvelles» (comme certaines choses HTML5), tout simplement ne fonctionnera pas, ou ne sera pas travailler comme prévu.


5 Réponses :


1
votes

Ceci est un comportement impair. J'ai testé dans Safari 6.1 sur Mac.

Mais puis-je demander pourquoi vous devez vous connecter quelque chose avant l'impression? Parce qu'il semble que toutes les fonctions soient exécutées avant que le panneau d'impression apparaisse: xxx

Lorsque vous examinez l'aperçu de l'impression, la page aura le texte "avant d'imprimer" dessus. Pour une raison quelconque, la console enregistre uniquement le texte uniquement lorsque le panneau d'impression se ferme, mais à mon avis qui n'a pas d'importance pour vos visiteurs. Vous pouvez manipuler DOM et changer la page avant votre processus d'impression.


5 commentaires

Oui @stéphaan, il n'est pas nécessaire d'ajouter console.log , mais j'ai vraiment besoin d'ajouter un code de manipulation DOM avant fenêtre.print () , et sur mon safari, le < Code> Fenêtre.Print (); TOUJOURS EXECUTEZ TOUJOURS EXÉCUT AVANT D'EXÉCUTER AVANT LE CODE JS AVANT D'IN AVANT, la même chose se produit même si je remplace fenêtre.print () au lieu de Settimeout (fenêtre. Imprimer (), 5000) .


C'est tout mon point entier, le DOM est manipulé avant la fenêtre .Print () . Essayez mon exemple dans Safari lorsque vous regardez l'aperçu de l'impression, vous verrez qu'il y a du texte sur la page.


Non, dans mon vrai code, je manipule Dom avant fenêtre.print () , et cela ne fonctionne pas, c'est pourquoi je pose cette question. Vous pouvez voir mes mises à jour sur la question, j'ai essayé de modifier la couleur de texte d'un élément avant fenêtre.print (); , mais la couleur n'a pas changé avant de cliquer sur le bouton Annuler sur le panneau d'impression.


Je viens de faire un autre test où j'ai changé la couleur du texte et la couleur de fond et cela a fonctionné bien. Il ne montre pas sur la page avant d'annuler la boîte de dialogue Imprimer, mais lorsque j'ai imprimé la page, il a eu la couleur modifiée, même sans settimeout, donc je ne sais pas pourquoi cela ne fonctionnera pas avec votre code


Eh bien, peut-être que c'est juste un problème sur Safari Windows.



1
votes

Après plusieurs fois, essayez, ci-dessous fonctionne, mais je ne connais pas la raison, quelqu'un peut-il expliquer? Ou ceci est un bug safari?

window.onload = function() {
    $('body').html('After change');
    setTimeout(window.print, 1000);
};


1 commentaires

Le problème est que les navigateurs arrêtent l'exécution JavaScript lorsque l'impression est initialisée. Safari peut initialiser l'impression avant que la console.log s'exécute, ce qui signifie qu'il retarde le journal.



2
votes

Pour moi, la solution Settimeout code> n'a pas fonctionné. J'ai trouvé ce plugin https://github.com/jasonday/printthis qui a beaucoup de solution de contournement pour fenêtre.Print () code> car il semble ne pas être entièrement pris en charge par tous les navigateurs.

J'ai pris cette ligne qui a fonctionné pour moi Safari document.execcommand ("print", faux, null ) code> p>

Et cela a fonctionné ok pour moi pour l'instant dans Safari et Chrome P>

try {
  document.execCommand('print', false, null);
}
catch(e) {
  window.print();
}


0 commentaires

0
votes

Safari imprime la page avant qu'il ne soit chargé, contrairement aux autres navigateurs. Par conséquent, Window.Onload () peut être utilisé dans le code de la page HTML nouvellement ouverte. Mais si la page ouverte est une teneur non HTML, elle n'est pas possible. La solution ci-dessous est globale entre navigateurs et type de contenu ouvert. xxx


0 commentaires

0
votes

Ajout d'une solution de plus qui a fonctionné pour mon cas:

Faites d'abord votre fenêtre contextuelle. P>

$(window).bind("load", function() {

    setTimeout( function () { 

      try {
        document.execCommand('print', false, null);
      }
      catch(e) {
        window.print();
      }

    }, 500);

});


0 commentaires