vue项目中引入tinymce4

上个项目用没记录,这次捣鼓了半天,赶紧拿小本本记下来~

ps:只实现了基本功能,图片上传有点问题,还得捣鼓捣鼓,捣鼓出来了再更新~

  1. 安装:

    npm install @tinymce/tinymce-vue -S
    npm install tinymce -S
  2. 安装之后,在 node_modules 中找到 tinymce/skins目录,然后将 skins 目录拷贝到 static 目录下,下载zh_CN.js文件也放在static/tinymce/
  3. 修改index.html文件:
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width,initial-scale=1.0">
        <title>graduation-project</title>
        <script src="https://cdn.bootcss.com/tinymce/4.8.4/tinymce.min.js"></script>
      </head>
      <body>
        <div id="app"></div>
        <!-- built files will be auto injected -->
      </body>
    </html>
    
  4. Editor.vue文件
    <template>
      <div style="margin: 20px auto; padding-top:20px;width: 80%;">
        <textarea :id="Id" :value="value"></textarea>
        <el-button @click="getContent">获取内容</el-button>
      </div>
    </template>
    <script>
      require('../../../static/tinymce/zh_CN.js') // 根据自己的组件路径修改
      export default {
        data () {
          const Id = Date.now()
          return {
            Id: Id,
            Editor: null,
            DefaultConfig: {
              // GLOBAL
              height: 900,
              theme: 'modern',
              menubar: false,
              toolbar: `styleselect | fontselect | formatselect | fontsizeselect | forecolor backcolor | bold italic underline strikethrough | image  media | table | alignleft aligncenter alignright alignjustify | outdent indent | numlist bullist | preview removeformat  hr | paste code  link | undo redo | fullscreen `,
              plugins: `
                paste
                importcss
                image
                code
                table
                advlist
                fullscreen
                link
                media
                lists
                textcolor
                colorpicker
                hr
                preview
              `,
              // CONFIG
    
              forced_root_block: 'p',
              force_p_newlines: true,
              importcss_append: true,
    
            // CONFIG: ContentStyle 这块很重要, 在最后呈现的页面也要写入这个基本样式保证前后一致, `table`和`img`的问题基本就靠这个来填坑了
              content_style: `
                *                         { padding:0; margin:0; }
                html, body                { height:100%; }
                img                       { max-width:100%; display:block;height:auto; }
                a                         { text-decoration: none; }
                iframe                    { width: 100%; }
                p                         { line-height:1.6; margin: 0px; }
                table                     { word-wrap:break-word; word-break:break-all; max-width:100%; border:none; border-color:#999; }
                .mce-object-iframe        { width:100%; box-sizing:border-box; margin:0; padding:0; }
                ul,ol                     { list-style-position:inside; }
              `,
              images_upload_url: 'https://sm.ms/api/upload',
              images_upload_base_path: '',
              insert_button_items: 'image link | inserttable',
    
              // CONFIG: Paste
              paste_retain_style_properties: 'all',
              paste_word_valid_elements: '*[*]',        // word需要它
              paste_data_images: true,                  // 粘贴的同时能把内容里的图片自动上传,非常强力的功能
              paste_convert_word_fake_lists: false,     // 插入word文档需要该属性
              paste_webkit_styles: 'all',
              paste_merge_formats: true,
              nonbreaking_force_tab: false,
              paste_auto_cleanup_on_paste: false,
    
              // CONFIG: Font
              fontsize_formats: '10px 11px 12px 14px 16px 18px 20px 24px',
    
              // CONFIG: StyleSelect
              style_formats: [
                {
                  title: '首行缩进',
                  block: 'p',
                  styles: { 'text-indent': '2em' }
                },
                {
                  title: '行高',
                  items: [
                    {title: '1', styles: { 'line-height': '1' }, inline: 'span'},
                    {title: '1.5', styles: { 'line-height': '1.5' }, inline: 'span'},
                    {title: '2', styles: { 'line-height': '2' }, inline: 'span'},
                    {title: '2.5', styles: { 'line-height': '2.5' }, inline: 'span'},
                    {title: '3', styles: { 'line-height': '3' }, inline: 'span'}
                  ]
                }
              ],
    
              // FontSelect
              font_formats: `
                微软雅黑=微软雅黑;
                宋体=宋体;
                黑体=黑体;
                仿宋=仿宋;
                楷体=楷体;
                隶书=隶书;
                幼圆=幼圆;
                Andale Mono=andale mono,times;
                Arial=arial, helvetica,
                sans-serif;
                Arial Black=arial black, avant garde;
                Book Antiqua=book antiqua,palatino;
                Comic Sans MS=comic sans ms,sans-serif;
                Courier New=courier new,courier;
                Georgia=georgia,palatino;
                Helvetica=helvetica;
                Impact=impact,chicago;
                Symbol=symbol;
                Tahoma=tahoma,arial,helvetica,sans-serif;
                Terminal=terminal,monaco;
                Times New Roman=times new roman,times;
                Trebuchet MS=trebuchet ms,geneva;
                Verdana=verdana,geneva;
                Webdings=webdings;
                Wingdings=wingdings,zapf dingbats`,
    
              // Tab
              tabfocus_elements: ':prev,:next',
              object_resizing: true,
    
              // Image
              imagetools_toolbar: 'rotateleft rotateright | flipv fliph | editimage imageoptions'
            }
          }
        },
        props: {
          value: {
            default: '',
            type: String
          },
          config: {
            type: Object,
            default: () => {
              return {
                theme: 'modern',
                height: 600
              }
            }
          },
          url: {
            default: '',
            type: String
          },
          accept: {
            default: 'image/jpeg, image/png',
            type: String
          },
          maxSize: {
            default: 2097152,
            type: Number
          },
          withCredentials: {
            default: false,
            type: Boolean
          }
        },
         headers: {
         'Content-type': 'application/json;charset=UTF-8'
          },
        mounted () {
          this.init()
        },
        beforeDestroy () {
          // 销毁tinymce
          this.$emit('on-destroy')
          window.tinymce.remove(document.getElementById(`{this.Id}`))
        },
    
        methods: {
          // 上传主图
          myFunction (){
            var x=document.getElementById("mainfile")
            var f= document.getElementById("mainfile").files[0]
            var formData=new FormData()
            var xmlhttp
            var self = this
            if (window.XMLHttpRequest)
            {
              //  IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
              xmlhttp=new XMLHttpRequest()
            }
            else
            {
              // IE6, IE5 浏览器执行代码
              xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
            }
            xmlhttp.onreadystatechange=function()
            {
              if (xmlhttp.readyState==4 && xmlhttp.status==200)
              {
                self.sproduct.pictures=JSON.parse(xmlhttp.responseText).data.url
              }
            }
            formData.append('smfile',f)
            xmlhttp.open('POST', 'https://sm.ms/api/upload',false)
            xmlhttp.send(formData)
          },
           init () {
             const self = this
    
            this.Editor = window.tinymce.init({
              // 默认配置
              ...this.DefaultConfig,
              // 图片上传
              images_upload_handler: function (blobInfo, success, failure) {
                if (blobInfo.blob().size > self.maxSize) {
                  failure('文件体积过大')
                }
    
                if (self.accept.indexOf(blobInfo.blob().type) >= 0) {
                  uploadPic()
                } else {
                  failure('图片格式错误')
                }
                function uploadPic () {
                  const xhr = new XMLHttpRequest()
                  const formData = new FormData()
                  formData.append('smfile', blobInfo.blob())
                  xhr.open('POST', 'https://sm.ms/api/upload')
                  xhr.onload = function () {
    
                    if (xhr.status !== 200) {
                      // 抛出 'on-upload-fail' 钩子
                      self.$emit('on-upload-fail')
                      failure('上传失败: ' + xhr.status)
                      return
                    }
    
                    const json = JSON.parse(xhr.responseText)
                    // 抛出 'on-upload-complete' 钩子
                    console.log(json.data.url)
                    self.$emit('on-upload-complete' , [
                      json.data, success, failure
                    ])
                     success(json.data.url)
                  }
                  formData.append('smfile', blobInfo.blob())
                  xhr.send(formData)
                }
              },
    
              // prop内传入的的config
              ...this.config,
    
              // 挂载的DOM对象
              selector: `#${this.Id}`,
              setup: (editor) => {
                // 抛出 'on-ready' 事件钩子
                editor.on(
                  'init', () => {
                    self.loading = false
                    self.$emit('on-ready')
                    editor.setContent(self.value)
                  }
                )
                // 抛出 'input' 事件钩子,同步value数据
                editor.on(
                  'input change undo redo', () => {
                    self.$emit('input', editor.getContent())
                  }
                )
              }
            })
          },
          getContent () {
            console.log(tinymce.editors[0].getContent())
          }
        }
      }
    </script>
    

    参考链接:

https://www.cnblogs.com/wisewrong/p/8985471.html

http://tinymce.ax-z.cn/advanced/some-example.php

原文地址:https://www.cnblogs.com/qujialin/p/12273896.html

时间: 2024-08-29 04:32:31

vue项目中引入tinymce4的相关文章

vue项目中引入Sass

Sass作为目前成熟,稳定,强大的css扩展语言,让越来越多的前端工程师喜欢上它.下面介绍了如何在vue项目 中引入Sass. 首先在项目文件夹执行命令 npm install vue-cli -g,安装vue-cli脚手架,若是已经安装了,则不必再次安装,直接 跳过这一步.接下来执行命令行vue init webpack mypro(注:mypro是项目名). 接下来安装Sass依赖包,使用以下命令行: npm install sass-loader --save-dev npm instal

解决vue项目中引入组件时出现的Module is not installed问题

如图,在vue项目中import自己定义的组件时,‘@api/table’出现下划线,ctrl+右键点击不会跳转到对应组件.鼠标移上去显示Module is not installed,多方查询后终于弄清楚了原因. 图中路径中有个@符号,这个符号是在build目录下的webpack.base.conf.js文件中定义的,代表当前项目的src目录. 之所以出现上述问题是因为在下图中的webpack中没有指定webpack 的配置文件,或者配置文件指定得不对.找到原因后解决方案就简单了,只需要将该配

在 Vue 项目中引入 tinymce 富文本编辑器

项目中原本使用的富文本编辑器是 wangEditor,这是一个很轻量.简洁编辑器 但是公司的业务升级,想要一个功能更全面的编辑器,我找了好久,目前常见的编辑器有这些: UEditor:百度前端的开源项目,功能强大,基于 jQuery,但已经没有再维护,而且限定了后端代码,修改起来比较费劲 bootstrap-wysiwyg:微型,易用,小而美,只是 Bootstrap + jQuery... kindEditor:功能强大,代码简洁,需要配置后台,而且好久没见更新了 wangEditor:轻量.

如何在vue项目中引入element ui组件

(1)安装element ui,即: npm i element-ui -S 然后在项目中的node_modules目录下查看是否有element-ui文件夹,如果有说明安装成功了: (2)引入element ui 在main.js中引入element ui,即: 1 import ElementUI from 'element-ui' 2 import 'element-ui/lib/theme-chalk/index.css' 3 Vue.use(ElementUI) [注意红色部分,以前是

vue项目中引入elementUI

1.安装淘宝npm镜像 输入命令:npm install -g cnpm --registry=https://registry.npm.taobao.org 2.安装全局vue-cli脚手架 cnpm install --global vue-cli 3.初始化一个vue项目 vue init webpack itemname 4.安装 elementUI npm i element-ui -S快捷键ctrl+c,终止批处理操 作吗(Y/N),在输入命令npm i element-ui -S

Vue项目中遇到的一些问题总结

一.开发环境使用Ajax请求,报错 网上查的资料,在config中的index.js这样设置 proxyTable:{ '/api':{ target:'', //此处为你的API接口地址 changeOrigin:true, pathRewrite:{ '^/api':'' //这里理解为用api代替target中的地址 } } } 配置完后,请求依然报错,大致是https证书的问题 [HPM] Error occured while trying to proxy request /xxx/

【vue】如何在 Vue-cli 创建的项目中引入 iView

根据vue项目的搭建教程,以下记录如何在Vue-cli创建的项目中引入iView. 1)iView的安装,在项目下使用 npm 安装iView cnpm install  iview  --save 2)在 webpack 入口页面 main.js   (E:\managerSys\manager-sys\src\main.js)中 添加 如下配置: import iView from 'iview'; // 导入组件库import 'iview/dist/styles/iview.css';

【vue】如何在 Vue-cli 创建的项目中引入iView

根据vue项目的搭建教程,一下记录下如何在Vue-cli创建的项目中引入iView. 1)安装iView,在项目下 cnpm install  iview  --save 2 ) 在 webpack 入口页面 main.js (E:\managerSys\manager-sys\src\main.js)中配置 import iView from 'iview'; // 导入组件库import 'iview/dist/styles/iview.css'; // 导入样式 Vue.use(iView

Vue 项目中使用 jsPlumb

jsPlumb 介绍 jsPlumb 是一个强大的 JavaScript 连线库,它可以将 html中 的元素用箭头.曲线.直线等连接起来,适用于开发 Web 上的图表.建模工具.流程图.关系图等. jsPlumb 参考网站 博客园:http://www.cnblogs.com/leomYili/p/6346526.html?utm_source=itdadao&utm_medium=referral 官网:https://www.jsplumbtoolkit.com/ 安装 jsPlumb v