2013-09-04 6 views
20

Mam do czynienia z naprawdę dziwnym problemem. Wywołuję window.print() z pliku javascript. Działa to dobrze w Safari, IE, Firefox ... i jeszcze dwie godziny temu działało również w Chrome. (Wersja 29.0.1547.57)Chrome: okno dialogowe drukowania window.print() otwiera się dopiero po przeładowaniu strony (javascript)

Nie zmieniłem niczego istotnego w moim pliku javascript (naprawdę - usunąłem tylko kilka komentarzy ...), ale to, co teraz się dzieje, jest naprawdę dziwne: w Chrome dialog drukowania nie otwiera się po wywołaniu window.print(). Nic się nie dzieje. Ale potem, kiedy naciskam przeładowanie, dialog drukowania natychmiast się otwiera.

Zachowanie w drugiej przeglądarce nie uległo zmianie. Podczas debugowania w Chrome widzę, że window.print() jest wywoływany zgodnie z oczekiwaniami, a skrypt działa po tym. Tylko dialog drukowania nie zostanie wyświetlony do momentu ponownego załadowania.

Czy ktoś kiedykolwiek doświadczył czegoś takiego? Próbowałem również wywołać window.print() w setTimeout(), ale to nic nie zmieniło. Kiedy debuguję treść strony, która ma być wydrukowana, wydaje się być idealnie załadowana.

Przykro mi to pytać, ale niczego nie znalazłem podczas badania. Każda pomoc będzie doceniona!

Dziękujemy!

+1

Może to być spowodowane otwartymi żądaniami sieci podczas wywoływania window.print()? Zobacz https://code.google.com/p/chromium/issues/detail?id=285690 i/lub http://stackoverflow.com/questions/14961769/javascript-window-print-intermittently-working-in-chrome dla podobnych kłopotów. – natevw

+0

Udaję to naprawić, dodając 'jquery.min.map' do mojego folderu projektu. Sprawdź pod kartą Sieć w Narzędziach programisty dla każdego oczekującego pliku. Podanie właściwej ścieżki lub jej usunięcie powinno rozwiązać problem. – rafaelcastrocouto

Odpowiedz

0

jestem najbardziej pewny, że występuje ten problem, bo trzeba elementu wideo na swojej stronie - najbardziej prawdopodobnie MP4.

Jeśli wyłączysz ten film/lub mieć film OGV zamiast drukowania powinny działać prawidłowo. Jest to błąd w samym chrome ze względu na ograniczenia implementacji wideo Chrome. Ważne jest również, aby pamiętać, że jeśli użytkownik drukuje ręcznie za pomocą Ctrl-P/cmd-P, funkcje drukowania poprawnie

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

Nadzieja to pomaga :)

+1

Dziękuję za odpowiedź! To nie było rozwiązanie - był to problem z zamawianiem połączeń. (Nadal nie bardzo to rozumiem ...) – oskar1983

+0

Czy mógłbyś wyjaśnić, co zrobiłeś, aby to naprawić @ oskar1983? – Clayton

+0

@Oscar - jeśli posiadasz tag wideo, prześlij również treść wideo w formacie OGV. To rozwiązałoby twój problem. :) – Wasiim

2

Mam dokładnie ten sam problem z Chrome. Musisz ręcznie przeładować stronę:

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

Z mojego doświadczenia wynika to z ciągłego ruchu w tle, np. wywołania ajaxowe i tym podobne, które uniemożliwiają Chrome wrażenie, że strona jest całkowicie załadowana. Przeładowanie przerywa cały ruch, a tym samym pojawia się okno dialogowe drukowania. To jest szczególna luka w Visual Studio 2013, gdzie BrowserLink nieustannie tyka w tle. ten może być testowany poprzez wyłączenie BrowserLink za pomocą poniższego ustawienia:

<configuration> 
    <appSettings> 
     <add key="vs:EnableBrowserLink" value="false"/> 
    </appSettings> 
</configuration> 
+0

to był ratownik - dziękuję! – user158017

+0

To podsłuchiwało mnie przez wieki, aż w końcu znalazłem tę odpowiedź. W moim przypadku jest to również lepsze rozwiązanie niż pierwsza odpowiedź, ponieważ dzieje się to tylko w trybie debugowania w VS2013. Moja opublikowana strona, a więc nie uruchomiona z VS, nie ma problemu. – Neville

14

Wasiim ma rację, jest to błąd Chrome gdzie window.print() nie działa, gdy jest <video> tag w DOM. Rozwiązałem to przez wywołanie tej funkcji:

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; 
} 
+0

Inteligentne zatrzymywanie ruchu. Ciekawe, jak ci się udało, że zatrzymanie przeładowania zadziała? Osobiście mogłem wymyślić ponowne załadowanie i oznaczyć problem jako rozwiązany. – Martin

+1

@Martin, po prostu przeładowanie w zasadzie rozwiązuje problem, ale po zamknięciu okna Drukuj strona przeładuje się. Więc pomyślałem o powstrzymaniu go przed ponownym załadowaniem za pomocą 'window.stop'. – noypiscripter

0

Podobne zachowanie w Safari. Jest to spowodowane przez otwarte żądania (żądania) HTTP w tle.

Kiedy każde żądanie HTTP jest w toku, window.print() zostaje pomyślnie wykonane, ale nie jest otwarte żadne okno dialogowe!

Będziesz miał ten problem, gdy użyć długie odpytywanie (dla serwera naciśnięciem). Ponieważ klient będzie miał już otwarte połączenie HTTP przez długi czas, window.print() nigdy nie będzie działać.