vue打印自定义html内容

本文介绍了如何在Vue项目中实现用户在使用表格等场景下调用打印功能。主要步骤包括创建并引入print.js文件,该文件用于处理自定义HTML内容的打印需求。
摘要由CSDN通过智能技术生成

在用户使用一些表格想要调用打印功能的时候,可以使用以下打印功能,可直接填写部分想要打印的内容打印

1.引入js文件

可以自定义一个文件夹名称如:print.js

const isDOM = (obj) => {
  return typeof HTMLElement === 'object'
    ? obj instanceof HTMLElement
    : obj &&
        typeof obj === 'object' &&
        obj.nodeType === 1 &&
        typeof obj.nodeName === 'string'
}
/* const extend = (obj, obj2) => {
  for (const k in obj2) {
    if (obj2.hasOwnProperty(k)) obj[k] = obj2[k]
  }
  return obj
} */
const isInBody = (node) => {
  return node === document.body ? false : document.body.contains(node)
}
const wrapperRefDom = (refDom) => {
  let prevDom = null
  let currDom = refDom
  if (!isInBody(currDom)) return currDom

  while (currDom) {
    if (prevDom) {
      const element = currDom.cloneNode(false)
      element.appendChild(prevDom)
      prevDom = element
    } else {
      prevDom = currDom.cloneNode(true)
    }
    currDom = currDom.parentElement
  }
  return prevDom
}
const getStyle = (options) => {
  let str = ''
  const styles = document.querySelectorAll('style,link')
  for (let i = 0; i < styles.length; i++) {
    str += styles[i].outerHTML
  }
  str +=
    '<style>' +
    (options.noPrint ? options.noPrint : '.no-print') +
    '{display:none;}</style>'
  return str
}
const getHtml = (dom, options) => {
  const inputs = document.querySelectorAll('input')
  const textAreas = document.querySelectorAll('textarea')
  const selects = document.querySelectorAll('select')

  for (let 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 (let k2 = 0; k2 < textAreas.length; k2++) {
    if (textAreas[k2].type === 'textarea') {
      textAreas[k2].innerHTML = textAreas[k2].value
    }
  }

  for (let k3 = 0; k3 < selects.length; k3++) {
    if (selects[k3].type === 'select-one') {
      const child = selects[k3].children
      for (const i in child) {
        if (child[i].tagName === 'OPTION') {
          if (child[i].selected === true) {
            child[i].setAttribute('selected', 'selected')
          } else {
            child[i].removeAttribute('selected')
          }
        }
      }
    }
  }
  return options.noPrintParent ? dom.outerHTML : wrapperRefDom(dom).outerHTML
}
const toPrint = (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)
  }
}
const writeIframe = (content) => {
  const iframe = document.createElement('iframe')
  const f = document.body.appendChild(iframe)
  iframe.id = 'myIframe'
  iframe.setAttribute(
    'style',
    'position:absolute;width:0;height:0;top:-10px;left:-10px;'
  )
  const w = f.contentWindow || f.contentDocument
  const doc = f.contentDocument || f.contentWindow.document
  doc.open()
  doc.write(content)
  doc.close()
  iframe.onload = function () {
    toPrint(w)
    setTimeout(function () {
      document.body.removeChild(iframe)
    }, 100)
  }
}

const Print = (dom, options) => {
  options = { ...options, noPrint: '.no-print' }
  let targetDom
  if (typeof dom === 'string') {
    try {
      targetDom = document.querySelector(dom)
    } catch {
      //自定义打印内容HTML
      const createDom = document.createElement('div')
      createDom.innerHTML = dom
      targetDom = createDom
      // console.log(createDom)
    }
  } else {
    targetDom = isDOM(dom) ? dom : dom.$el
  }

  const content = getStyle(options) + getHtml(targetDom, options)
  writeIframe(content)
}

export default Print

2.在需要打印的页面引入上述js

<template>
	<el-button type="primary" @click="print('vab-print-image')" class="mr10">打印
	<el-button type="primary" @click="printDelivery()" class="mr10">打印</el-button>
</template>
<script>
  import { mapActions } from 'vuex'
  import VabPrint from '@/extra/VabPrint'

  export default {
    name: 'Print',
    data() {
      return {
      }
    },
    methods: {
      async print(val) {
        await VabPrint(this.$refs[val], { noPrintParent: true })
      },
      async printDelivery() {
        let printHtml='<h1>Vue Admin Plus111111</h1><p>我是自定义内容P标签</p>'
      	await VabPrint(printHtml, { noPrintParent: false })
      },
    },
  }
</script>
标题复制10行,并且每行大于10个字符 标题复制10行,并且每行大于10个字符 标题复制10行,并且每行大于10个字符 标题复制10行,并且每行大于10个字符 标题复制10行,并且每行大于10个字符 标题复制10行,并且每行大于10个字符 标题复制10行,并且每行大于10个字符 标题复制10行,并且每行大于10个字符 标题复制10行,并且每行大于10个字符 标题复制10行,并且每行大于10个字符
Vue 3中的自定义指令可以用于操作DOM元素,包括复制元素。在Vue 3中,我们可以通过调用`app.directive`来创建一个自定义指令。下面是一个例子,展示如何实现复制功能的自定义指令。 ```javascript // 在Vue 3中创建一个自定义指令 app.directive('copy', { mounted(el, binding) { // 绑定指令时执行的逻辑 el.addEventListener('click', () => { // 复制元素的内容到剪贴板 navigator.clipboard.writeText(el.textContent) .then(() => { // 成功复制的处理逻辑 console.log('Copied to clipboard!'); }) .catch(err => { // 复制失败的处理逻辑 console.error('Failed to copy text: ', err); }); }); } }) ``` 在上面的例子中,我们定义了一个名为`copy`的自定义指令,它会在元素被点击时将其内容复制到剪贴板。在`mounted`钩子函数中,我们为元素添加了一个点击事件监听器。当元素被点击时,我们使用`navigator.clipboard.writeText`方法将元素的内容写入剪贴板。如果复制成功,我们会在控制台打印一条成功消息,否则会打印一个错误消息。 要在模板中使用自定义指令,只需要将其绑定在需要添加指令的元素上。在下面的例子中,我们将自定义指令`copy`绑定在一个元素上。 ```html <template> <div> <p v-copy>This text will be copied when clicked.</p> </div> </template> ``` 在这个例子中,当这个`<p>`元素被点击时,它的内容将被复制到剪贴板。这是用Vue 3实现复制功能的简单例子,你可以根据自己的需求进行自定义指令的定义和实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值