21

以前にここで議論されたことは知っていますが、これに対する実用的な解決策/回避策は見つかりませんでした。誰かがこの問題を解決する方法を知っていることを願っています!

ここにあります:

Google Chrome で (ユーザーが印刷ボタンをクリックした場合のように) 1 つのページ内でメソッドを頻繁に呼び出そうとするとwindow.print()、ブラウザーはコンソールに次のような警告メッセージをスローします。

print() の頻繁な呼び出しを無視する

そして、何も起こりません!window.print()数秒後、通常の状態に戻り、コマンドを再度呼び出した瞬間に印刷ダイアログが表示されます! さらに悪いことに、善良な Chrome のユーザーは、印刷コマンドを呼び出すページに指数関数的な待機時間を使用します。つまり、ユーザーがボタンをクリックして印刷するほど、印刷ダイアログが表示されるまで待たなければなりません!

この問題はかなり長い間 chrome に存在しており (14 以降のバージョン) 、バグであることが確認されています。昨日、Google チームに再度投稿しました。Chrome チームの誰かがこの信じられないほど迷惑な機能がいつ修正されるかを確認できることを願っています。 !Area-UI

ただし、ここで探しているのは、この問題の回避策です。これを機能させるためにできることはありますか? 私の会社は、印刷が必要な多数のレポートを含む高度にトランザクションの多い財務システムを開発しています。このわずかな不具合が原因で、プロジェクト全体が私のお気に入りの Google Chrome ブラウザーで実行されてしまう危険があります。

アップデート:

この機能を引き起こすChrome ブラウザのコードは次のとおりです。誰かが印刷コマンドを再度呼び出すまでに少なくとも 2 秒かかるようです。そのため、UI で 2 秒間隔のタイマーを設定すると、無限待機コールバックが発生するのを防ぐことができます。他の考えはありますか?

4

6 に答える 6

19

window.print()関数を条件付きで置き換えることができます。

// detect if browser is Chrome
if(navigator.userAgent.toLowerCase().indexOf("chrome") >  -1) {
    // wrap private vars in a closure
    (function() {
        var realPrintFunc = window.print;
        var interval = 2500; // 2.5 secs
        var nextAvailableTime = +new Date(); // when we can safely print again

        // overwrite window.print function
        window.print = function() {
            var now = +new Date();
            // if the next available time is in the past, print now
            if(now > nextAvailableTime) {
                realPrintFunc();
                nextAvailableTime = now + interval;
            } else {
                // print when next available
                setTimeout(realPrintFunc, nextAvailableTime - now);
                nextAvailableTime += interval;
            }
        }
    })();
}

外部の安全タイマー/ラッパーを使用する代わりに、内部のものを使用できます。これを追加するだけwindow.printで、Chrome やその他の場所で安全に動作します。(さらに、閉鎖は を意味しrealPrintFunc、新しいものに対して非公開です。intervalnextAvailableTimewindow.print

window.printフレーム化された複数のページ間でへの呼び出しを調整する必要がある場合nextAvailableTimeは、クロージャではなく親ページに設定して、すべてのフレームが を使用して共有値にアクセスできるようにすることができますwindow.parent.nextAvailableTime

于 2012-05-04T17:54:12.423 に答える
4

私は同じ問題にぶつかっています。私にとって最も直接的な解決策は、新しいウィンドウを作成し、必要なものを書き込んで閉じ、印刷することでした。Chromeをこのように機能するように変更して以来、Chromeの制限に対処する必要はなく、追跡を行う必要もありません。

print_window= window.open();
print_window.document.write(print_css + divToPrint[0].outerHTML+"</html>");
print_window.document.close();
print_window.focus();
print_window.print();
print_window.close();
于 2012-05-14T00:15:58.810 に答える
1

この問題について言及しているところはどこでも、タイマーの使用を示唆しています。しかし、彼らは問題を解決しておらず、実際に情報源を読んで問題を理解しているのはカミヤールだけだと思う​​ので、なぜ彼が答えを受け入れたのだろうか。

主な問題は、Chromeの遅延の長さが指数関数的であるため、これらのタイマーが機能するためには、使用するたびに遅延を増やす必要があります。もちろん、これは非常にすぐに煩わしくなります。Chromeは実際には、キャンセルされた印刷リクエストの後にのみ遅延を適用しますが、とにかく印刷が成功したかどうかを検出することはできません。

Abathurのソリューションは、実際には予想よりもはるかにうまく機能します。使用するかどうかはわかりませんが、機能します。

良いニュース:

1)Chromeの最新バージョンでは、実際には遅延が減少しています。今では次のようになります[2, 2, 2, 4, 8, 16, 32, 32, ...]

2)誰かが8月28日にこの問題を取り上げました:http ://code.google.com/p/chromium/issues/detail?id = 50186この問題を解決したい場合は、スターを付けてください。

于 2012-09-15T20:43:25.947 に答える
1

すべてのプリンターがネットワーク対応の場合、印刷ボタンをクリックしたときの動作を変更できます。アプリケーションは、ページを印刷する代わりに、印刷するページの URL と印刷するプリンターに関する情報を含む要求をサーバーに送信できます。

その後、サーバーは印刷プロセスを手動で起動しますが、その間にブラウザーが存在しないため、印刷プロセスが停止する可能性があります。

于 2012-05-04T16:42:07.093 に答える
1

もう回避策はありません。私が間違っていなければ、v.23 の一部としてバグが修正されました。

したがって、リリース サイクルが 6 週間ごとで、Chrome 22 が 9 月 25 日にリリースされた場合、修正は11 月 6 日までに(およそ) Chrome 安定版に含まれます。

于 2012-10-15T14:15:24.433 に答える
1

私の解決策は、電話をかけるwindow.print()頻度を減らすことです。独自のメソッドにラップして、が再度実行されるwindow.print()までに経過しなければならない最小時間間隔を設定することができます。window.print()作業が行われていることを示すために、UI に何らかの変更やアニメーションを表示できます。

"働く"

印刷ボタンを 1 秒に 1 回または数秒ごとに 2 回以上押すと本当に効果があると思わない限り? つまり、window.print()操作にそれほど時間がかかる場合、それはコードのせいではなく、とにかくUIに「待機して我慢してください」というインジケーターが必要です。

于 2012-05-04T12:42:38.513 に答える