JS实现富文本粘贴图片

1.实现原理

利用html中 contenteditable 属性+JS判断

2.代码

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>

<body>
  <div class="editable" id="richedit" contenteditable>111111111</div>
  <script>
    //监听粘贴事件
    document.querySelector('#richedit').addEventListener('paste', function (e) {
      var cbd = e.clipboardData;
      console.log(cbd)
      var ua = window.navigator.userAgent;
      if (!(cbd && cbd.items)) {
        return;
      }
      //判断浏览器
      if (cbd.items && cbd.items.length === 2 && cbd.items[0].kind === 'string' && cbd.items[1].kind === 'file' && cbd.types && cbd.types.length === 2 && cbd.types[0] === 'text/plain' && cbd.typesp[1] === 'Files' && ua.match(/Macintosh/i) && Number(ua.match(/Chrome\/(\d{2})/i)[1]) < 49) {
        return;
      }
      //判断是图片渲染
      for (var i = 0; i < cbd.items.length; i++) {
        var item = cbd.items[i];
        if (item.kind == 'file') {
          var blob = item.getAsFile();
          if (blob.size === 0) {
            return;
          }
          var reader = new FileReader();
          var imgs = new Image();
          imgs.file = blob;
          reader.onload = (function (aImg) {
            return function (e) {
              aImg.src = e.target.result;
            }
          })(imgs)
          reader.readAsDataURL(blob)
          document.querySelector('#richedit').appendChild(imgs)
        }
      }
    }, false)
  </script>
</body>

</html>

 3.参考

http://tieba.baidu.com/p/6023597119?pid=123901122159&cid=0#123901122159

在 Vue 中实现富文本编辑器支持粘贴图片功能,可以通过选择合适的富文本编辑器组件,并结合后端图片上传接口来实现。以下是几种常见方案及其关键实现步骤。 ### 使用 `vue-quill-editor` 实现粘贴图片功能 `vue-quill-editor` 是基于 Quill 的 Vue 封装,支持自定义图片上传逻辑。默认情况下,它会将图片转为 Base64 编码,但可以通过自定义处理粘贴事件来上传图片到服务器。 关键步骤如下: 1. **引入并注册 `vue-quill-editor`** ```bash npm install vue-quill-editor ``` 2. **在组件中配置 `quill` 的 `clipboard` 模块**,监听粘贴事件并提取图片数据: ```javascript import { Quill } from 'vue-quill-editor' import axios from 'axios' const ImageFormat = Quill.import('formats/image') ImageFormat.sanitize = function (url) { // 允许 base64 或 http(s) 图片 return url.startsWith('data:') || url.startsWith('http') ? url : null } Quill.register(ImageFormat, true) export default { name: 'Editor', data() { return { content: '', editorOptions: { modules: { clipboard: { matchVisual: false } } } } }, methods: { onPaste(e) { const items = (e.clipboardData || e.originalEvent.clipboardData).items for (let i = 0; i < items.length; i++) { if (items[i].type.indexOf('image') !== -1) { const blob = items[i].getAsFile() const formData = new FormData() formData.append('image', blob) axios.post('/api/upload-image', formData).then(res => { const editor = this.$refs.myQuillEditor.quill const range = editor.getSelection() editor.insertEmbed(range.index, 'image', res.data.url) editor.setSelection(range.index + 1) }) } } } } } ``` 3. **在模板中绑定事件** ```html <quill-editor ref="myQuillEditor" v-model:content="content" :options="editorOptions" @paste="onPaste" /> ``` ### 使用 `TinyMCE` 实现粘贴图片功能 TinyMCE 提供了强大的粘贴插件 `powerpaste`,支持从 Word、网页等来源粘贴图文内容,并自动上传图片。 1. **安装 TinyMCE 及相关插件** ```bash npm install tinymce ``` 2. **引入插件并配置粘贴选项** ```javascript import tinymce from 'tinymce/tinymce' import 'tinymce/themes/silver' import 'tinymce/plugins/image' import 'tinymce/plugins/paste' import 'tinymce/plugins/powerpaste' export default { mounted() { tinymce.init({ selector: '#editor', plugins: 'image paste powerpaste', powerpaste_word_import: 'merge', powerpaste_html_import: 'merge', powerpaste_allow_local_images: true, paste_data_images: true, images_upload_handler: (blobInfo, success, failure) => { const formData = new FormData() formData.append('image', blobInfo.blob(), blobInfo.filename()) fetch('/api/upload-image', { method: 'POST', body: formData }) .then(res => res.json()) .then(data => success(data.url)) .catch(() => failure('上传失败')) } }) } } ``` 3. **在模板中添加编辑器容器** ```html <textarea id="editor"></textarea> ``` ### 使用 `Ant Design Vue` + `vue-quill-editor` 实现图文混排和图片大小调整 如果项目中使用了 `Ant Design Vue`,可以结合 `vue-quill-editor` 实现更丰富的功能,如设置图片大小、图文混排等。 1. **父组件中引入并使用富文本组件** ```javascript import myDomEditor from './components/MyDomEditor.vue' export default { components: { myDomEditor }, data() { return { content: '' } }, methods: { msgEvent(e) { this.content = e } } } ``` 2. **子组件中处理图片粘贴上传逻辑** ```javascript export default { props: ['content'], methods: { handlePaste(e) { const clipboardData = e.clipboardData || window.clipboardData const items = clipboardData.items for (let i = 0; i < items.length; i++) { if (items[i].type.indexOf('image') !== -1) { const blob = items[i].getAsFile() const reader = new FileReader() reader.onload = () => { const editor = this.$refs.editor.quill const range = editor.getSelection() editor.insertEmbed(range.index, 'image', reader.result) editor.setSelection(range.index + 1) } reader.readAsDataURL(blob) } } } } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值