js中paste粘贴事件

业务需求

在评论输入框粘贴图片后实现图片自动上传

实现思路
  1. 用富文本编辑器实现
  2. 监听输入框的粘贴事件

考虑到项目其他地方没有富文本的需求,引入富文本增大代码大小,因此选择js方法paste粘贴事件

paste事件

paste: 在 发生 粘贴 操作 时 触发

绑定的元素不一定是input,普通的div也是可以绑定的,如果是给document绑定了,就相当于全局了,任何时候的粘贴操作都会触发

事件对象

操作的数据放在clipboardData对象中的,在ie中这个对象通过window.clipboardData来访问,在其它浏览器中则通过事件处理函数的参数来访问。

获取事件对象:
handlePaste(event) {
var clipboardData = event.clipboardData || window.clipboardData
}

粘贴事件提供了一个clipboardData的属性,如果该属性有items属性,那么就可以查看items中是否有图片类型的数据了。

clipboardData介绍

介绍一下clipboardData对象,它实际上是一个DataTransfer类型的对象,DataTransfer 是拖动产生的一个对象,但实际上粘贴事件也是它。
clipboardData的属性介绍:

属性类型说明
dropEffectString默认是 none
effectAllowedString默认是 uninitialized
filesFileList粘贴操作为空List
itemsDataTransferItemList剪切板中的各项数据
typesArray剪切板中的数据类型
items介绍

items是一个DataTransferItemList对象,自然里面都是DataTransferItem类型的数据了。

属性

items的DataTransferItem有两个属性kind和type:

属性说明
kind一般为string或者file
type具体的数据类型,例如具体是哪种类型字符串或者哪种类型的文件,即MIME-Type
方法
方法参数说明
getAsFile如果kind是file,可以用该方法获取到文件
getAsString回调函数如果kind是string,可以用该方法获取到字符串,字符串需要用回调函数得到,回调函数的第一个参数就是剪切板中的字符串
types介绍

types常见的值:text/plain, text/html, files

说明
text/plain普通字符串
text/html带有样式的html
files文件(例如剪切板中的数据)
Demo
  methods: {
    // 粘贴监听图片上传
    handlePaste (event) {
      // console.log(event)

      var clipboardData = event.clipboardData || window.clipboardData
      console.log(clipboardData) // 查看clipboardData
      const items = clipboardData.items
      const types = clipboardData.types
      let file = null

      var text = clipboardData.getData('text/plain')

      // 搜索剪切板items
      for (let i = 0; i < items.length; i++) {
        console.log(items[i])
        if (items[i].type.indexOf('image') !== -1) {
          file = items[i].getAsFile()
          // break
        } else {
          // clipboardData.clearData(items[i].type)
          var str = clipboardData.getData(items[i].type)
          console.log(str)
        }
      }

      // 搜索剪切板types
      for (let i = 0; i < types.length; i++) {
        console.log(types[i])
      }

      if (!file) {
        return
      }
      this.isPasteImg = true
      // 此时file就是我们的剪切板中的图片对象
      let form = new FormData()
      form.append('file', file)
      let that = this
      api.commonInterface(
        that.uploadUrl,
        'Post',
        function (res) {
          that.uploadSuccess(res.data, file, text)
        },
        form
      )
    },

clipboardData对象有三个方法:getData()、 setData() 和 clearData()。在使用getData或setData时,要指定文档类型,ie中使用text或URL,其它浏览使用mime类型(text/plain)

setData()和clearData()方法只有在ie中才能设置剪贴板数据,在其它浏览器中设置后剪贴板数据依然无效

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值