打开一个新的JavaScript窗口(.open)及其CSS样式

时间:2013-09-12 07:39:21

标签: javascript jquery html css printing

我正在尝试让这个功能在我正在进行的项目的网站上工作。此函数的目的是仅(物理地)打印子div的内容,该div通常被称为选择器#content。

到目前为止,我已经得到了一点点:

<script>
    function printContent() {
        window.open().document.write($("#content").html());
        window.print();
        window.close();
    }
</script>

当用户点击“打印”超链接时会触发该功能。新窗口将加载#content div的内容,该内容从另一个HTML文档中解析:

<div id="content">
    <br/>
    <div id="Algemeen">
        <h3>Algemene informatie</h3>
        <fieldset id="profile">
            <img id="male" src="./images/Pixers/male_icon.jpg"></img>
            <img id="female" src="./images/Pixers/female_icon1.jpg"></img>
        </fieldset>
    </div>
    <div id ="leftbox">   
        <div id ="veldbox"><label>BSN:</label>$!person.bsn</div>
        <div id ="veldbox"><label>Voornaam: </label>$!person.first_name</div>
        <div id ="veldbox"><label>Achternaam:</label>$!person.name_prefix $!person.last_name</div>
        <div id ="veldbox"><label>Geslacht:</label>$!person.gender</div>  
        <div id ="veldbox"><label>Woonadres:</label>$!person.address</div>
        <div id ="veldbox"><label>Plaatsnaam:</label>$!person.location</div>
        <div id ="veldbox"><label>Provincie:</label>$!person.province</div>
        <div id ="veldbox"><label>Postcode:</label>$!person.zipcode</div>
        <div id ="veldbox"><label>Tel. nummer thuis:</label>$!person.h_number</div>
        <div id ="veldbox"><label>Mobiel nummer:</label>$!person.mobile_nr</div>
        <div id ="veldbox"><label>Burgerlijke Stand:</label>$!person.m_status</div>
        <div id ="veldbox"><label>land van herkomst:</label>$!person.origin</div>
    </div>
    <div id="rightbox">
        <div id ="veldbox"><label>Naam instantie:</label></div>
        <div id ="veldbox"><label>Adres instantie:</label></div>
        <div id ="veldbox"><label>Postcode instantie:</label></div>
        <div id ="veldbox"><label>Tel. instantie:</label></div>
        <div id ="veldbox"><label>Fax instantie:</label></div>
        <div id ="veldbox"><label>E-mail instantie:</label></div>
        <div id ="veldbox"><label>Website instantie:</label></div>
        <div id ="veldbox"><label>-:</label></div>
        <div id ="veldbox"><label>-:</label></div>
        <div id ="veldbox"><label>-:</label></div>  
    </div>
</div>

它不会随之加载样式。所有内容都将在左上角裁剪。我已经尝试通过JS链接CSS,或者只是按照另一页上的建议将其放在页面的头部。我当然可能做错了。我还没有真正尝试用JQuery解决这个问题,所以如果你有任何其他解决方案可以帮助我解决我的问题,我很高兴并愿意接受一些关于它们的建议。

提前致谢!

7 个答案:

答案 0 :(得分:34)

在打开的窗口中构建一个完整的HTML页面并在那里引用您的CSS文件:

var win = window.open('','printwindow');
win.document.write('<html><head><title>Print it!</title><link rel="stylesheet" type="text/css" href="styles.css"></head><body>');
win.document.write($("#content").html());
win.document.write('</body></html>');
win.print();
win.close();

答案 1 :(得分:10)

我做了类似于上面示例的操作,但发现它并不适用于所有浏览器。以下是所有主流浏览器的测试,适合我。 (请记住,某些样式可能依赖于父元素,因此如果div嵌套在这些元素中,则样式在打印窗口中看起来可能与父页面上的样式不完全相同)

function printWithCss() {
        //Works with Chome, Firefox, IE, Safari
        //Get the HTML of div
        var title = document.title;
        var divElements = document.getElementById('printme').innerHTML;
        var printWindow = window.open("", "_blank", "");
        //open the window
        printWindow.document.open();
        //write the html to the new window, link to css file
        printWindow.document.write('<html><head><title>' + title + '</title><link rel="stylesheet" type="text/css" href="/Css/site-print.css"></head><body>');
        printWindow.document.write(divElements);
        printWindow.document.write('</body></html>');
        printWindow.document.close();
        printWindow.focus();
        //The Timeout is ONLY to make Safari work, but it still works with FF, IE & Chrome.
        setTimeout(function() {
            printWindow.print();
            printWindow.close();
        }, 100);
    }

答案 2 :(得分:8)

我想拥有父页面中的所有样式和打印。所以我想在 HEAD 中使用所有 css 链接

我的解决方案使用 jQuery

(function print() {
    // getting the tag element I want to print
    // cloning the content so it doesn't get messed
    // remove all the possible scripts that could be embed
    var printContents = $('body').clone().find('script').remove().end().html();

    // get all <links> and remove all the <script>'s from the header that could run on the new window
    var allLinks = $('head').clone().find('script').remove().end().html();

    // open a new window
    var popupWin = window.open('', '_blank');
    // ready for writing
    popupWin.document.open();

    // -webkit-print-color-adjust to keep colors for the printing version
    var keepColors = '<style>body {-webkit-print-color-adjust: exact !important; }</style>';

    // writing
    // onload="window.print()" to print straigthaway
    popupWin.document.write('<html><head>' + keepColors + allLinks + '</head><body onload="window.print()">' + printContents + '</body></html>');

    // close for writing
    popupWin.document.close();
})();

答案 3 :(得分:5)

我在页面渲染后也遇到了CSS加载的问题,因此解决方法是读取css文件内容并将其写入新文档:

    var w = window.open();
    jQuery.get('/styles.css', function (data) {
        w.document.write('<html><head><style>');
        w.document.write(data);
        w.document.write('</style></head><body>');
        w.document.write($('.print-content').html());
        w.document.write('</body></html>');
        w.print();
        w.close();
    });

答案 4 :(得分:1)

我有同样的问题。我发现它是在css有时间在页面上呈现之前打印的。我所做的就是在打印调用上执行setTimeout,然后所有样式都显示在打印文档中。如果我没有超时,我发现打印调用中没有拾取样式。

答案 5 :(得分:0)

以防万一有人试图通过Angular做到这一点,请将您的CSS文件放在资产文件夹中。

答案 6 :(得分:0)

此代码对我有用,可以使其成为 Windows 中心。

<a href="http://twitter.com/intent/tweet?text=[TWEET_CONTENT_GOES_HERE]" 
  onclick="window.open(this.href, 
  'twitterwindow', 
  `top=${(screen.height - 570)/2}, left=${(screen.width - 570)/2}, width=600, 
   height=300, resizable=1`); return false;">
  Tweet this
</a>