美文网首页js综合插件
前端实现打印 样式不丢失

前端实现打印 样式不丢失

作者: 爱学习的小仙女早睡早起 | 来源:发表于2023-03-27 16:43 被阅读0次
const Print = function (dom, options) {
    if (!(this instanceof Print)) return new Print(dom, options);

    this.options = this.extend({
        noPrint: '.no-print',
        onStart: function () {},
        onEnd: function () {}
    }, options);

    if ((typeof dom) === "string") {
        this.dom = document.querySelector(dom);
    } else {
        this.dom = dom;
    }

    this.init();
};
Print.prototype = {
    init: function () {
        let content = this.getStyle() + this.getHtml();
        this.writeIframe(content);
    },
    extend: function (obj, obj2) {
        for (let k in obj2) {
            obj[k] = obj2[k];
        }
        return obj;
    },

    getStyle: function () {
        let str = "";
        let styles = document.querySelectorAll('style,link');
        for (let i = 0; i < styles.length; i++) {
            str += styles[i].outerHTML;
        }
        str += "<style>" + (this.options.noPrint ? this.options.noPrint : '.no-print') + "{display:none;}</style>";

        return str;
    },

    getHtml: function () {
        let inputs = document.querySelectorAll('input');
        let textareas = document.querySelectorAll('textarea');
        let selects = document.querySelectorAll('select');

        for (let k in inputs) {
            if (inputs[k].type === "checkbox" || inputs[k].type === "radio") {
                if (inputs[k].checked === true) {
                    inputs[k].setAttribute('checked', "checked");
                } else {
                    inputs[k].removeAttribute('checked');
                }
            } else if (inputs[k].type === "text") {
                inputs[k].setAttribute('value', inputs[k].value);
            }
        }

        for (let k2 in textareas) {
            if (textareas[k2].type === 'textarea') {
                textareas[k2].innerHTML = textareas[k2].value;
            }
        }

        for (let k3 in selects) {
            if (selects[k3].type === 'select-one') {
                let child = selects[k3].children;
                for (let i in child) {
                    if (child[i].tagName === 'OPTION') {
                        if (child[i].selected === true) {
                            child[i].setAttribute('selected', "selected");
                        } else {
                            child[i].removeAttribute('selected');
                        }
                    }
                }
            }
        }
        return this.dom.outerHTML;
    },

    writeIframe: function (content) {
        let w;
        let doc;
        let iframe = document.createElement('iframe');
        let f = document.body.appendChild(iframe);
        iframe.id = "myIframe";
        iframe.style = "position:absolute;width:0;height:0;top:-10px;left:-10px;";
        w = f.contentWindow || f.contentDocument;
        doc = f.contentDocument || f.contentWindow.document;
        doc.open();
        doc.write(content);
        doc.close();
        this.toPrint(w, function () {
            document.body.removeChild(iframe);
        });
    },

    toPrint: function (w, cb) {
        let _this = this;
        w.onload = function () {
            try {
                setTimeout(function () {
                    w.focus();
                    typeof _this.options.onStart === 'function' && _this.options.onStart();
                    if (!w.document.execCommand('print', false, null)) {
                        w.print();
                    }
                    typeof _this.options.onEnd === 'function' && _this.options.onEnd();
                    w.close();
                    cb && cb();
                });
            } catch (err) {
                console.log('err', err);
            }
        };
    }
};

组件里引用js 直接调用

相关文章

  • vue项目 打印多页 分页 随手记

    一、使用window.print()打印 ,打开一个新窗口,实现多页打印效果,但样式会丢失,只能内嵌样式; ...

  • 前端实现打印功能(筛选打印表格)

    前端实现打印也并没有那么难。起初是后端实现打印,前端调取接口,但无法实现单选框的样式,无法对数据进行筛选,这才选择...

  • 2022-03-07cad图纸打印样式丢失处理办法

    cad图纸打印样式丢失处理办法 用于cad图纸绘制、粘贴过程中打印样式丢失的处理方法。 方法/步骤 1 开始打印图...

  • react 前端实现打印发票/图片

    需求:由于原型中发票的样式有一丢丢复杂,所以我们采用后端提供数据,前端编排打印模板的方案来实现。方案:前端采用浏览...

  • 【vue学习】整合Lodop

    前端实现自动打印 批量打印 vue中使用lodop调用标签打印机 利用lodop打印控件轻松实现批量打印 本文主要...

  • 打印网页时,前端写法

    打印网页时,在保证打印效果的前提下,前端要怎么写呢 1.在打印时调用的样式(px--->pt(打印时使用pt)、样...

  • 前端打印

    简单介绍一下前端打印的做法和一些问题 一、简介 前端打印即浏览器打印,是通过浏览器的打印功能来实现打印效果的做法。...

  • 前后端分离_分页

    在分页类编写数据,展示前端实现跳转 你的数据样式 前端接收数据,展示

  • js实现页面部分内容打印功能

    为了实现页面某个部分的div内容打印,并且打印时样式可能需要修改一下,总结如下方法自用。 页面样式设置注意事项 j...

  • 前端实现打印功能

    打印样式 一、添加打印样式 为屏幕显示和打印分别准备一个css文件,如下所示:用于屏幕显示的css: 用于打印的...

网友评论

    本文标题:前端实现打印 样式不丢失

    本文链接:https://www.haomeiwen.com/subject/ouezrdtx.html