web-dev-qa-db-fra.com

Chrome: le dialogue d'impression window.print () s'ouvre uniquement après le rechargement de la page (javascript)

Je suis confronté à un problème vraiment étrange. J'appelle window.print () depuis un fichier javascript. Cela fonctionne très bien dans Safari, IE, Firefox ... et jusqu'à il y a deux heures, cela fonctionnait également dans Chrome. (Version 29.0.1547.57)

Je n’ai rien changé d’essentiel dans mon fichier javascript (en fait, j’ai simplement enlevé quelques commentaires ...), mais ce qui se passe maintenant est vraiment bizarre: Sous Chrome, la boîte de dialogue d’impression ne s’ouvre pas lorsque window.print () est appelée. Rien ne se passe. Mais ensuite, lorsque j'appuie sur reload, la boîte de dialogue d'impression s'ouvre immédiatement.

Le comportement dans l'autre navigateur n'a pas changé. Et pendant le débogage dans Chrome, je constate que window.print () est appelé comme prévu et le script se poursuit par la suite. Seul le dialogue d'impression n'apparaît que lorsque vous appuyez sur reload.

Quelqu'un a-t-il déjà vécu quelque chose comme ça? J'ai aussi essayé d'appeler window.print () dans setTimeout (), mais cela n'a rien changé. Lorsque je débogue, le contenu de la page à imprimer semble être parfaitement chargé. 

Je suis désolé de demander, mais je n'ai rien trouvé lors de mes recherches. Toute aide serait appréciée!

Je vous remercie!

21
oskar1983

Wasiim a raison, il y a un bogue dans Chrome où window.print() ne fonctionne pas lorsqu'il existe une balise <video> dans le DOM. Je l'ai résolu en appelant cette fonction:

function printPage() {
    window.print();

    //workaround for Chrome bug - https://code.google.com/p/chromium/issues/detail?id=141633
    if (window.stop) {
        location.reload(); //triggering unload (e.g. reloading the page) makes the print dialog appear
        window.stop(); //immediately stop reloading
    }
    return false;
}
14
noypiscripter

D'après mon expérience, cela est dû au trafic continu en arrière-plan, par exemple. les appels ajax et autres qui empêchent Chrome de sentir que la page est complètement chargée. Le rechargement interrompt tout le trafic et la boîte de dialogue d'impression apparaît. Ceci est un casse-tête particulier dans Visual Studio 2013 où BrowserLink se décale continuellement en arrière-plan. Ceci peut être testé en désactivant BrowserLink via le paramètre ci-dessous:

<configuration>
    <appSettings>
        <add key="vs:EnableBrowserLink" value="false"/>
    </appSettings>
</configuration>
7
Steven Wilber

J'ai exactement le même problème avec Chrome. Vous devez recharger manuellement la page:

    <a href="javascript:window.print();window.location.reload()">Print</a> 
2
Tepliuk

Si, par hasard, quelqu'un utilise VS2013 avec du chrome, ce problème est dû à la fonctionnalité de BrowserLink.

voir SO répondre ici

2
Francisco

Comportement similaire dans Safari. C'est causé par la ou les requêtes HTTP ouvertes en arrière-plan.

Lorsqu'une requête HTTP est en cours, window.print() est exécuté avec succès, mais aucune boîte de dialogue n'est ouverte!

Vous aurez ce problème, when vous utilisez un long polling (pour le serveur Push). Puisque le client aura déjà ouvert la connexion HTTP pendant longtemps, window.print() ne fonctionnera jamais.

0
Martin

Je suis presque certain que vous rencontrez ce problème car vous avez un élément vidéo sur votre page - très probablement un MP4.

Si vous désactivez cette vidéo/ou si vous avez une vidéo OGV à la place, l'impression devrait fonctionner correctement. Il s'agit d'un bogue inhérent à Chrome, en raison des limitations de l'implémentation vidéo de Chrome. Il est également important de noter que si l’utilisateur imprime manuellement avec ctrl-p/cmd-p, les fonctions d’impression fonctionnent correctement.

http://code.google.com/p/chromium/issues/detail?id=141633

J'espère que cela t'aides :)

0
Wasiim