7

当サイトには、会員プロフィールを印刷できる機能があります。これが機能する方法は、onsubmit を介して JavaScript 関数をボタンにアタッチすることです。javascript 関数は、window.open を使用して特別なモードでページを再度開き、ページの印刷用バージョンを再表示します。

この機能は 2008 年頃から導入されており、すべてのブラウザーで動作します。約 1 週間ほど前を除いて、Chrome で動作しなくなりました。Chrome では、開いているウィンドウが開くのに、別の空白のウィンドウが一時的に開き、その後すべてが閉じます。

この問題の議論を検索したところ、正確な問題を見つけることができませんでしたが、onsubmit に「return false」を追加する必要があるという記述が見つかりました。それを追加しようとしましたが、役に立ちませんでした。

onsubmit は次のようになります。

<button onclick="PrintEmailSubmit('print');">Print Profile</button>

ウィンドウを開くコードは次のようになります。

window.open('print-email-profile.php?mode=' + mode,'','width=' + width + ',height=' + height + ',scrollbars=yes,location=0,menubar=1,status=0,toolbar=0')

見る必要はありませんが、PrintEmailSubmit() 関数全体を次に示します。

/*
 *  called by view-profile.php
 */
function PrintEmailSubmit(mode)
{
    var width;
    var height;
    switch(mode)
    {
        case 'print':
            width = 850;
            height = 1000;
            break;

        case 'email':
            width = 400;
            height = 120;
            break;

        default:
            alert('Error: invalid calling sequence -- should not happen!');
            exit;
    }
    window.open('print-email-profile.php?mode=' + mode,'','width=' + width + ',height=' + height + ',scrollbars=yes,location=0,menubar=1,status=0,toolbar=0');
}

そして最後に、これが機能する理由は、ページの特別なバージョンの body タグに次のものが追加されていることです。

<body onload="window.print();window.close();">

上記のとおり、機能は引き続き IE と Firefox で動作します。Chromeだけがこの問題を抱えています。

何か案は?

4

6 に答える 6

8

ボタンと window.open は、実際には問題とは何の関係もありません。

問題は、Chrome が印刷する前にユーザー入力を探していることです。Window.print() は印刷ダイアログ ウィンドウを開きますが、Chrome はユーザーが印刷を完了するのを待っていません。window.close() は、印刷ダイアログ ウィンドウと親の他のすべてを閉じています。

時間を節約するために、OnAfterPrint フックは Chrome ではまったく使用されないことに注意してください。また、window.close() を onLoad に、window.print() を onBeforeUnload に入れてみましたが、印刷ダイアログは window.close() をキャンセルします。次善の策は、次のようなことです。

//In your profile print page
<html>
<head>
<script>
var is_chrome = function () { return Boolean(window.chrome); }
if(is_chrome) 
{
   window.print();
   setTimeout(function(){window.close();}, 10000); 
   //give them 10 seconds to print, then close
}
else
{
   window.print();
   window.close();
}
</script>

<body onLoad="loadHandler();">

私はこれをテストしていませんが、アイデアをかなり効果的に示していると思います。

于 2013-08-14T19:08:52.277 に答える
2

私はこの解決策を見つけました、そしてそれは本当にうまくいきます:

<body onload="window.print();window.onmouseover = function() { self.close(); } ">
于 2013-11-18T15:37:21.363 に答える
1

Chrome は非常に高速であるため、ドキュメントが読み込まれる前に実際に印刷を呼び出します。そのため、Mari のように、または次のように、print 関数を onload に移動するのが最善の方法です。

winPrint = window.open("", "winPrint", "width=1,height=1");
winPrint.document.write(html);
winPrint.onload = function () {
    window.print();
    window.close();
};

また、IE では機能しないため、完全なコードは次のようになります。

var is_chrome = Boolean(window.chrome);
if (is_chrome) {
    winPrint.onload = function () {
        window.print();
        window.close();
    };
}
else {
    winPrint.print();
    winPrint.close();
}
于 2014-08-06T14:30:01.083 に答える
1

Mr.bresleveloper ソリューションをいくつか変更して使用します。

var is_chrome = Boolean(window.chrome);
if (is_chrome) {
    winPrint.onload = function () {
        setTimeout(function () { // wait until all resources loaded 
            winPrint.print();  // change window to winPrint
            winPrint.close();// change window to winPrint
        }, 200);
    };
}
else {
    winPrint.print();
    winPrint.close();
}
于 2014-12-24T08:21:58.150 に答える