js 免费可靠cdn地址(富文本编辑器tinymce的实践)

推荐一个 cdn源的可靠源地址(免费且持久)

https://www.jsdelivr.com/?query=tinymce

有个富文本编辑的需求,要求导入html字符串去生成富文本htm,使用的是react

在react中 单一的使用tinymce.init去初始化富文本容器元素会导致初始化有时候不生效,因为tinymce是异步加载初始化的,于是,我们需要配合@tinymce/tinymce-react这个针对react的tinymce包去展示
需要注意的是,tinymce作为富文本编辑器,它本身自带了一些插件和工具,但是也有一些是不携带的,属于第三方提供的,比如plugins/indent2em

用Npm下载的tinymce以及@tinymce/tinymce-react这两个包都不支持展示菜单栏中的工具,使用的部分cdn也不可靠,因为它们内部引用文件报错,再加上公司的网络限制很严格,一些cdn无法获取到对应的资源,因此写了这篇文章记录可靠方案
解决后的截图:
在这里插入图片描述在这里插入图片描述

具体使用如下:
  <script src="https://cdn.jsdelivr.net/npm/tinymce@5.1.0/tinymce.min.js" ></script>
import { Editor } from '@tinymce/tinymce-react';
// import tinymce from 'tinymce/tinymce';
import moment from 'moment';
import lang from '../../../../public/zh_CN';
import 'tinymce/themes/silver/theme';
import 'tinymce/skins/ui/oxide/skin.min.css';
import 'tinymce/skins/ui/oxide/content.min.css';
import 'tinymce/plugins/lists';
import 'tinymce/plugins/advlist';
import 'tinymce/plugins/hr';
import 'tinymce/plugins/image';
import 'tinymce/plugins/charmap';
// import 'tinymce/plugins/indent2em';
import '../../../../public/indent2em';
useEffect(() => {
    const Tinymce = tinymce.init({
      selector: '#tinydemo',
      plugins: 'searchreplace wordcount visualblocks code fullscreen insertdatetime media nonbreaking', // 这排的插件如果不完整,会导致菜单栏相关功能不显示 他们是有依赖的
      contextmenu: 'configurepermanentpen',
      toolbar: 'permanentpen code',
      menubar: 'file edit view format table tools help', // tools就是我们想要实现的功能
      menu: {
        format: {
          title: 'Format',
          items: 'configurepermanentpen | bold italic underline strikethrough ' +
            'superscript subscript codeformat | formats blockformats fontformats ' +
            'fontsizes align | forecolor backcolor | removeformat'
        }
      },
      permanentpen_properties: {
        fontname: 'arial,helvetica,sans-serif',
        forecolor: '#E74C3C',
        fontsize: '12pt',
        hilitecolor: '',
        bold: true,
        italic: false,
        strikethrough: false,
        underline: false
      },
      height: 500,
      content_style: 'body { font-family:Helvetica,Arial,sans-serif; font-size:14px }'
    });
    return () => {
      tinymce.remove('#tinydemo');
    }
  }, []);
const tinymce = window.tinymce;
<div id="tinydemo">
                      <Editor
                        init={{
                          setup: EditorView,
                          height: '600px',
                          language_url: lang,
                          language: 'zh_CN',
                          fontsize_formats: '8px 10px 12px 14px 16px 18px 24px 28px 32px 36px 42px',
                          font_formats:
                            '微软雅黑;宋体;仿宋;黑体;楷体;隶书;幼圆;Arial=arial;sans=serif;Georgia=georgia;Symbol=symbol;Arial Black=arial black;Times New Roman=times new roman;',
                          plugins: 'code fullscreen lists advlist hr image indent2em',
                          toolbar1: `undo redo | style-p style-h1 style-h2 style-h3 style-pre style-code | formatselect fontselect fontsizeselect indent2em`,
                          toolbar2: `bold italic underline strikethrough hr backcolor forecolor | alignleft aligncenter alignright alignjustify removeformat | bullist numlist outdent indent | image`,
                          // branding: false, // 是否禁用“Powered by TinyMCE”
                          // menubar: false, // 顶部菜单栏显示
                          elementpath: false,
                          images_upload_handler: async (blobInfo: any, success: (url: any) => void, failure: () => void) => {
                            var formData = new FormData();
                            formData.append('file', blobInfo.blob());

                            if (formData) {
                              const res = await upload(formData);
                              t = 1;
                              // let url = res.url && res.url.split('?auth.token=')[0];
                              // success(url + '?auth.token=' + Cookie.get('auth.token'));
                              success(res.url);
                            }
                          },
                        }}
                        onEditorChange={(v) => {
                          onChangeDrawer(v);
                        }}
                        value={htmlContent}
                      />
</div>
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue 3中有很多富文本编辑器的选择,其中一个常用的是TinyMCE。要在Vue 3中使用TinyMCE富文本编辑器,可以按照以下步骤进行: 1. 首先,使用npm或者yarn安装TinyMCE编辑器依赖包: ``` npm install tinymce ``` 2. 在Vue组件中引入需要的TinyMCE编辑器资源文件。有多种方式可以引入,这里以CDN引入为例: ```html <script src="https://cdn.jsdelivr.net/npm/tinymce@5"></script> ``` 3. 创建一个Vue组件,并在其中添加一个textarea元素作为编辑器容器: ```html <template> <div> <textarea id="my-editor"></textarea> </div> </template> ``` 4. 在Vue组件的`mounted`钩子函数中初始化TinyMCE编辑器,并指定其选项和回调函数: ```javascript <script> import { onMounted } from 'vue'; export default { mounted() { onMounted(() => { tinymce.init({ selector: '#my-editor', height: 500, plugins: 'advlist autolink lists link image charmap print preview anchor', toolbar: 'undo redo | formatselect | bold italic backcolor | \ alignleft aligncenter alignright alignjustify | \ bullist numlist outdent indent | removeformat | help', setup: (editor) => { editor.on('change', () => { this.$emit('input', editor.getContent()); }); }, }); }); }, }; </script> ``` 这里的选项和回调函数可以根据实际需要进行配置,你可以根据TinyMCE的文档来设置更多的选项。 5. 最后,在使用该组件的父组件中,可以通过`v-model`来双向绑定富文本编辑器的内容: ```html <template> <div> <RichTextEditor v-model="content" /> <div> <h3>输出的内容:</h3> <div v-html="content"></div> </div> </div> </template> <script> import RichTextEditor from './RichTextEditor.vue'; export default { components: { RichTextEditor, }, data() { return { content: '', }; }, }; </script> ``` 这样,就可以在Vue 3中使用TinyMCE富文本编辑器了。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hzxOnlineOk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值