js打印功能

Posted auserroot

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js打印功能相关的知识,希望对你有一定的参考价值。

打印功能实现(ie兼容)
  • 设置打印区域 ref=‘printDiv’
  • 清除按钮、输入框线条样式
  • 打印
  • 恢复页面样式
具体实现

定义print方法

// print
const Print = function (dom, options) 
    if (!(this instanceof Print)) return new Print(dom, options);
  
    this.options = this.extend(
      'noPrint': '.no-print'
    , options);
  
    if ((typeof dom) === "string") 
      this.dom = document.querySelector(dom);
     else 
      this.isDOM(dom)
      this.dom = this.isDOM(dom) ? dom : dom.$el;
    
  
    this.init();
  ;
  Print.prototype = 
    init: function () 
      var content = this.getStyle() + this.gethtml();
      this.writeIframe(content);
    ,
    extend: function (obj, obj2) 
      for (var k in obj2) 
        obj[k] = obj2[k];
      
      return obj;
    ,
  
    getStyle: function () 
      var str = "",
        styles = document.querySelectorAll('style,link');
      for (var 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 () 
      var inputs = document.querySelectorAll('input');
      var textareas = document.querySelectorAll('textarea');
      var selects = document.querySelectorAll('select');
  
      for (var k = 0; k < inputs.length; k++) 
        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)
         else 
          inputs[k].setAttribute('value', inputs[k].value)
        
      
  
      for (var k2 = 0; k2 < textareas.length; k2++) 
        if (textareas[k2].type == 'textarea') 
          textareas[k2].innerHTML = textareas[k2].value
        
      
  
      for (var k3 = 0; k3 < selects.length; k3++) 
        if (selects[k3].type == 'select-one') 
          var child = selects[k3].children;
          for (var 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) 
      var w, doc, iframe = document.createElement('iframe'),
      f = document.body.appendChild(iframe);
      iframe.id = "myIframe";
      iframe.setAttribute('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();
      var _this = this
      iframe.onload = function()
        _this.toPrint(w);
        setTimeout(function () 
          document.body.removeChild(iframe)
        , 100)
      
    ,
  
    toPrint: function (frameWindow) 
      try 
        setTimeout(function () 
          frameWindow.focus();
          try 
            if (!frameWindow.document.execCommand('print', false, null)) 
              frameWindow.print();
            
           catch (e) 
            frameWindow.print();
          
          frameWindow.close();
        , 10);
       catch (err) 
        console.log('err', err);
      
    ,
    isDOM: (typeof HTMLElement === 'object') ?
      function (obj) 
        return obj instanceof HTMLElement;
       :
      function (obj) 
        return obj && typeof obj === 'object' && obj.nodeType === 1 && typeof obj.nodeName === 'string';
      
  ;

  export default Print

方法调用

handlePrint()
                console.log('///',this.$refs.printDiv)
                let val = getExplorerInfo()
                this.$refs.printBtn.style.display = 'none'
                let btn = document.querySelectorAll('.el-button')
                let input = document.querySelectorAll('input')
                let textarea = document.querySelectorAll('textarea')
                if(val.type!=='IE')
                	btn.forEach(item=>item.style.display='none')
                    input.forEach(item=>item.style.border='0')
                    textarea.forEach(item=>item.style.border='0')
					//调用 print 方法
                    print(this.$refs.printDiv)
                    //打印后恢复样式
                    input.forEach(item=>item.style.border='1')
                    textarea.forEach(item=>item.styleborder='1')
                else
                	//ie兼容配置
                    let el = document.createElement('OBJECT')
                    el.setAttribute('classid','CLSID:8856F961-340A-11D0-A96B-00C04FD705A2')
                    el.setAttribute('height','0')
                    el.setAttribute('id','wb')
                    el.setAttribute('name','wb')
                    el.setAttribute('width','0')
                    document.head.appendChild(el)
                    console.log(this.$refs.printDiv.innerHTML)
                    for(let i =0;i<btn.length;i++)
                        btn[i].style.display='none'
                    
                    for(let i =0;i<input.length;i++)
                        input[i].style.border = '0'
                        input[i].setAttribute('value',input[i].value)
                    
                    for(let i =0;i<textarea.length;i++)
                        textarea[i].style.border = '0'
                    
                    let dom = this.$refs.printDiv.innerHTML
                    document.body.innerHTML = dom

                    // dom.textContent = this.$refs.printDiv.textContent


                    document.querySelector('#wb').ExecWB(7,1)
                    // window.print()

                    for(let i =0;i<btn.length;i++)
                        (btn[i].style.display='block')&&(btn[i].style.marginLeft='12px')
                    
                    for(let i =0;i<input.length;i++)
                        input[i].style.border = '1'
                    
                    for(let i =0;i<textarea.length;i++)
                        textarea[i].style.border = '1'
                    
                    document.head.removeChild(el)
                
                this.$refs.printBtn.style.display = 'block'
                // window.location.reload()

            ,

以上是关于js打印功能的主要内容,如果未能解决你的问题,请参考以下文章

js打印功能

js打印功能

JS调用浏览器的打印功能

js 实现打印功能

JS 打印功能代码可实现打印预览打印设置等

layui js 自定义打印功能实现