我的页面上有一些要打印的内容。在打印时,某些div必须被隐藏,而只有一个会出现。该代码可以在Chrome,Firefox和IE上正常运行,但不能在Safari上运行。

这是我的JS:

$(".printButton").on("click", function (event) {
    event.preventDefault();

    $("form").attr("style", "display: none !important");
    $("body").append("<div class='divToBePrinted' style='display: block !important;'></div>");
    $(".content").clone().appendTo('.divToBePrinted');

    window.print();

    $("form").removeAttr("style");
    $(".divToBePrinted").remove();
});

这是我的简化HTML:
<html>
    <body>
        <form>
            <!-- Other content -->
            <div class="content">
                Content to be printed.
            </div>
            <button class="printButton"></button>
            <!-- Other content -->
        </form>
    </body>
</html>

在Safari上,window.print()似乎在event.preventDefault()之前执行,从而捕获了要打印的整个页面。

编辑:我试图像下面那样使用setTimeout,但是没有用。有特定于打印的CSS,但是文件很大。我试图将其删除,但是得到了相同的结果:在所有浏览器上都可以正常运行,但在Safari上却不能。

具有setTimeout的JS:
$(".printButton").on("click", function (event) {
event.preventDefault();

$("form").attr("style", "display: none !important");
$("body").append("<div class='divToBePrinted' style='display: block !important;'></div>");
$(".content").clone().appendTo('.divToBePrinted');

//setTimeout(window.print, 1000); -- I tried this way

// And this way
setTimeout(function () {
    window.print();

    $("form").removeAttr("style");
        $(".divToBePrinted").remove();
    }, 0);
});

编辑2:我试图将setTimeout设置为1000毫秒,并且它在大多数情况下都有效,但是它不是最终的解决方案,因此我将进行新的研究以找到更好的方法。
setTimeout(function () {
    window.print();

    $("form").removeAttr("style");
    $(".divToBePrinted").remove();
}, 1000);

最佳答案

看来onafterprint事件几乎在window.print之后立即触发。

在大多数浏览器上,只有在用户单击“打印对话框”上的“打印”时才调用此事件,但是在Safari上,似乎会随着“打印对话框”的显示而触发。

09-25 16:09