Vue中使用editor.md(2):添加拖拽图片上传功能

news2025/2/6 20:06:47

0. 背景

在对editor.md简单使用后,希望添加图片拖拽或粘贴上传的功能。
简单使用参考:Vue中使用editor.md(1):简单使用

1. 实现

1.1 添加粘贴监听

在这里插入图片描述

// 使用axios
import axios from '@/api/index'

function initPasteDragImg (Editor) {
  console.log('init paste drag image')
  const doc = document.getElementById(Editor.id)
  doc.addEventListener('paste', function (event) {
    const items = (event.clipboardData || window.clipboardData).items
    let file = null
    console.log(items)
    console.log(items.length)
    if (items && items.length) {
      // 搜索剪切板items
      for (let i = 0; i < items.length; i++) {
        if (items[i].type.indexOf('image') !== -1) {
          file = items[i].getAsFile()
          break
        }
      }
    } else {
      console.log('当前浏览器不支持')
      return
    }
    if (!file) {
      console.log('粘贴内容非图片')
      return
    }
    uploadImg(file, Editor)
  })
  const dashboard = document.getElementById(Editor.id)
  dashboard.addEventListener('dragover', function (e) {
    e.preventDefault()
    e.stopPropagation()
  })
  dashboard.addEventListener('dragenter', function (e) {
    e.preventDefault()
    e.stopPropagation()
  })
  dashboard.addEventListener('drop', function (e) {
    e.preventDefault()
    e.stopPropagation()
    const files = this.files || e.dataTransfer.files
    uploadImg(files[0], Editor)
  })
}

async function uploadImg (file, Editor) {
  const formData = new FormData()
  const fileName = new Date().getTime() + '.' + file.name.split('.').pop()
  formData.append('file', file, fileName)
  /* $.ajax({
    url: Editor.settings.imageUploadURL,
    type: 'post',
    data: formData,
    processData: false,
    contentType: false,
    dataType: 'json',
    success: function (msg) {
      console.log(msg)
      const success = msg.success
      if (success == 1) {
        const url = msg.url
        if (/\.(png|jpg|jpeg|gif|bmp|ico)$/.test(url)) {
          Editor.insertValue('![](' + msg.url + ')')
        } else {
          Editor.insertValue('[下载附件](' + msg.url + ')')
        }
      } else {
        console.log(msg)
        alert('上传失败')
      }
    }
  }) */
  // 向服务器发送请求
  try {
    const res = await axios.common.files.uploadSingleFile(file)
    console.log(res)
    if (res.data.errCode === 0) {
      const url = res.data.data
      if (/\.(png|jpg|jpeg|gif|bmp|ico)$/.test(url)) {
        Editor.insertValue('![](' + res.data.data + ')')
      } else {
        Editor.insertValue('[下载附件](' + res.data.data + ')')
      }
    } else {
      alert('上传失败')
    }
  } catch (e) {
    console.log(e.message)
  }
}
export {
  initPasteDragImg
}

1.2 引入粘贴功能

在这里插入图片描述

<template>
  <div class="markdown-editor-box">
    <link rel="stylesheet" href="./static/editor.md/css/editormd.min.css">
    <div :id="editorId"></div>
  </div>
</template>

<script>
import scriptjs from 'scriptjs'
import { defaultConfig } from '@/config/MarkdownConfig'
import { initPasteDragImg } from '@/config/uploadImg'

export default {
  name: 'MarkdownEditor',
  props: {
    editorId: {
      type: String,
      default: 'markdown-editor'
    },
    onchange: {
      type: Function
    },
    config: {
      type: Object
    },
    initData: {
      type: String
    },
    initDataDelay: {
      type: Number,
      default: 0
    }
  },
  data () {
    return {
      editor: null,
      editorLoaded: false
    }
  },
  methods: {
    fetchScript (url) {
      return new Promise(resolve => {
        scriptjs(url, () => {
          resolve()
        })
      })
    },
    getConfig () {
      return { ...defaultConfig, ...this.config }
    },
    getEditor () {
      return this.editor
    },
    getDoc () {
      return this.doc
    },
    watch () {
      return this.editor.watch()
    },
    unwatch () {
      return this.editor.unwatch()
    },
    previewing () {
      return this.editor.previewing()
    },
    getHTML () {
      return this.editor.getHTML()
    },
    getMarkdown () {
      return this.editor.getMarkdown()
    },
    setMarkdown (markdown) {
      return this.editor.setMarkdown(markdown)
    },
    initEditor () {
      (async () => {
        await this.fetchScript('./static/editor.md/jquery-1.10.2.min.js')
        await this.fetchScript('/static/editor.md/editormd.min.js')
        this.$nextTick(() => {
          const editor = window.editormd(this.editorId, this.getConfig())
          console.log('init editor ', editor)
          editor.on('load', () => {
            setTimeout(() => {
              // 拖拽上传图片
              initPasteDragImg(editor)
              this.editorLoaded = true
              this.initData && editor.setMarkdown(this.initData)
            }, this.initDataDelay)
          })
          this.onchange && editor.on('change', () => {
            const html = editor.getPreviewedHTML()
            this.onchange({
              markdown: editor.getMarkdown(),
              html: html,
              text: window.$(html).text()
            })
          })
          this.editor = editor
        })
      })()
    }
  },
  mounted () {
    this.initEditor()
  },
  watch: {
    initData: function (newVal) {
      if (newVal) {
        this.editorLoaded && this.editor.setMarkdown(newVal)
      }
    }
  }
}
</script>

<style scoped lang="less">

</style>

2. 测试

在这里插入图片描述

x. 参考

  1. editorMd插件的使用总结(包括开启图片上传及拖拉粘贴上传图片)
  2. markdown编辑器之editormd使用整合

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/641236.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是Vue的插件?如编写自定义 Plugin?

什么是Vue的插件&#xff1f; 在Vue开发中&#xff0c;我们经常需要使用一些第三方库或功能性模块&#xff0c;Vue插件就是一种将这些库或模块集成到Vue应用中的方式。插件是Vue.js提供的一种机制&#xff0c;用于扩展Vue的功能。插件通常用于封装某些特定的功能&#xff0c;例…

【AI人工智能】 你如果要使用最强大的语言模型,你还要有最精美的浏览器标签页iTab (2)

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&#x1…

UnityA*导航算法,通俗易懂

首先A*寻路算法分为2D算法和3D算法&#xff0c;目前它甚至不如NAVMesh算法效率高。但NAVMesh不适用于2D&#xff0c;因此2D还是要靠A*算法来进行实现。 当前就来说说2D是如何实现的。 首先2DA*算法先要将地图划分成格子分块标记成二维数组 每个格子依据x&#xff0c;y&#xf…

又一新型技术全面铺开,高精度光刻机已突破壁垒,赶超只是时间

众所周知&#xff0c;光刻机是制造高精度芯片的关键步骤。 随着科技的不断进步&#xff0c;光刻机的精度和速度也在不断提高&#xff0c;使得我们可以制造出更小更精细的芯片&#xff0c;满足了人们对于高性能电子设备的需求。 我国的光刻机技术&#xff0c;国产大飞机&#x…

【华为OD机试真题2023B卷 JAVAJS】二维伞的雨滴效应

华为OD2023(B卷)机试题库全覆盖,刷题指南点这里 二维伞的雨滴效应 知识点递归树 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 普通的伞在二维平面世界中,左右两侧均有一条边,而两侧伞边最下面各有一个伞坠子,雨滴落到伞面,逐步流到伞坠处,会将伞坠的信息携…

UML类图(二)

相信希望&#xff0c;相信自己 上一章简单介绍了 设计模式的原则(一), 如果没有看过,请观看上一章 本文参考文章: 常见UML符号详解 UML (Unified modeling language) 统一建模语言&#xff0c;是一种用于软件系统分析和设计的语言工具&#xff0c; 它用于帮助软件开发人员进行…

强烈推荐协同办公的三个小工具

强烈推荐协同办公的三个小工具 这里给大家推荐三个可以用于协同办公的小软件工具。那么&#xff0c;什么是协同办公呢&#xff1f;直接下定义给个概念那就不好玩了&#xff0c;所以我直接推荐这么几个协同软件大家就懂了。 ONLYOFFICE办公软件 具体的软件截图我这里就不贴了&…

【Android】Frida Hook 文件读写操作

前言 在挖掘客户端漏洞的时候&#xff0c;通常会关注应用对什么文件进行了读写操作&#xff0c;当我们能控制被读的文件或观测到敏感写入的文件&#xff0c;通常可以造成一定危害。本文详细介绍了如何通过frida监控文件读写操作。 相关知识 1. 读写相关调用api 在Linux系统…

有哪些自媒体平台有播放量就会有收益?

自媒体是近年来兴起的一种新型媒体&#xff0c;指的是由个人或小团体通过互联网自行发布内容&#xff0c;通过社交媒体等渠道传播和推广的媒体形态。自媒体平台的出现&#xff0c;让更多人能够自由发表意见和观点&#xff0c;实现了信息的自由传播。同时&#xff0c;随着互联网…

跨平台.NET应用UI组件DevExpress XAF v22.2亮点 - 支持.NET 7

DevExpress XAF是一款强大的现代应用程序框架&#xff0c;允许同时开发ASP.NET和WinForms。DevExpress XAF采用模块化设计&#xff0c;开发人员可以选择内建模块&#xff0c;也可以自行创建&#xff0c;从而以更快的速度和比开发人员当前更强有力的方式创建应用程序。 在新版中…

数据结构——二叉树基础结构篇(C语言)

引言 现在是北京时间2023年6月13日9点11分。从决定要开始减脂之后&#xff0c;饥饿总是伴随着我。一觉起来肚子咕咕叫&#xff0c;我还是想先把文章发了再吃第一餐。燕麦加蛋白粉几乎伴随了我大学的第一年早饭。昨天练了一个小时背&#xff0c;练背后还做了45分钟有氧。空腹训…

BeautifulPrompt:PAI推出自研Prompt美化器,赋能AIGC一键出美图

作者&#xff1a;曹庭锋、汪诚愚、吴梓恒、黄俊 背景 Stable Diffusion&#xff08;SD&#xff09;是一种流行的AI生成内容&#xff08;AI Generated Content&#xff0c;AIGC&#xff09;模型&#xff0c;能在文字输入的基础上生成各种风格多样的图像。在目前的AIGC方向&…

十五周算法训练营——普通动态规划(上)

今天是十五周算法训练营的第十一周&#xff0c;主要讲普通动态规划&#xff08;上&#xff09;专题。&#xff08;欢迎加入十五周算法训练营&#xff0c;与小伙伴一起卷算法&#xff09; 斐波那契数 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那…

设计模式——适配器模式

1.定义 将一个类的接口转换成客户所希望的另一个接口&#xff0c;Adapter模式使得那些原本因为接口不兼容而不能一起工作的那些类可以一起工作。 2.使用场景 一般来说&#xff0c;适配器模式可以看作一种“补偿模式”&#xff0c;用来补救设计上的缺陷。应用这种模式算是“无…

驱动开发:内核LoadLibrary实现DLL注入

远程线程注入是最常用的一种注入技术&#xff0c;在应用层注入是通过CreateRemoteThread这个函数实现的&#xff0c;该函数通过创建线程并调用 LoadLibrary 动态载入指定的DLL来实现注入&#xff0c;而在内核层同样存在一个类似的内核函数RtlCreateUserThread&#xff0c;但需要…

【模型评估】AP 和他们的兄弟们:mAP、AP50、APs、APm、APl

AP是在目标检测任务中&#xff0c;尝尝被用于评估模型预测能力的指标。那AP是什么&#xff1f;为什么能够充当不同模型综合对比评测的公认指标呢&#xff1f; 在学习下文之前&#xff0c;混淆矩阵和ROC可以先了解下&#xff1a; 【模型评估】混淆矩阵&#xff08;confusion_m…

世界中西医结合医学研究院一行莅临万民健康交流指导

为进一步发展中医药产业&#xff0c;深入挖掘中医药文化&#xff0c;坚持中西医并重&#xff0c;传承精华&#xff0c;守正创新&#xff0c;助力乡村振兴、促进乡村医疗产业发展。6 月 10 日 &#xff0c; 世界中西医结合医学研究院医学工程院院士罗先义 、谈家桢生命基金会主任…

测试左移及其相关实践

本文首发于个人网站「BY林子」&#xff0c;转载请参考版权声明。 之前在《敏捷测试的核心》、《构建测试的体系化思维&#xff08;进阶篇&#xff09;》和《一页纸测试策略》等文章中提到过测试左移&#xff0c;但是没有专门针对这个主题做过系统的介绍&#xff0c;但又总是被社…

M4内核的FPU/DSP使用总结

FPU简介 近年&#xff0c;在Cortex-M3之后ARM公司又推出Cortex-M4内核&#xff0c;ARM Cortex-M4处理器是由ARM专门开发的最新嵌入式处理器&#xff0c;在M3的基础上强化了运算能力&#xff0c;新加了浮点、DSP、并行计算等。Cortex-M4处理器的最大亮点之一&#xff0c;也是本文…

dom-to-image分享多张异步图片遇到的坑

dom-to-image库 存在的问题 github-issue地址 问题&#xff1a;当超过一张图片时&#xff0c;ios/safari首次会出现某张图片空白&#xff0c;再次生成canvas才正常。 之前有一张图片时通过执行2次domtoimage.toJpeg&#xff08;魔法&#xff09;&#xff0c;当超过1张图片时&a…