<template> <div class='tinymce-container editor-container'> <textarea class='tinymce-textarea' :id="id"></textarea> </div> </template> <script> // import { getToken, upload } from 'api/qiniu'; // 七牛 export default { name: 'tinymce', props: { id: { type: String, default: 'tinymceEditor' }, value: { type: String, default: '' }, toolbar: { type: Array, required: false, default() { return ['removeformat undo redo | bullist numlist | outdent indent | forecolor | fullscreen code', 'bold italic blockquote | h2 p media link | alignleft aligncenter alignright'] } }, data() { return { hasChange: false, hasInit: false } }, menubar: { default: '' }, height: { type: Number, required: false, default: 360 } }, watch: { value(val) { if (!this.hasChange && this.hasInit) { this.$nextTick(() => tinymce.get(this.id).setContent(val)) } } }, mounted() { const _this = this; tinymce.init({ selector: `#${this.id}`, height: this.height, body_class: 'panel-body ', object_resizing: false, // language: 'zh_CN', // language_url: '/static/tinymce/langs/zh_CN.js', toolbar: this.toolbar, menubar: this.menubar, plugins: 'advlist,autolink,code,paste,textcolor, colorpicker,fullscreen,link,lists,media,wordcount, imagetools,watermark', end_container_on_empty_block: true, powerpaste_word_import: 'clean', code_dialog_height: 450, code_dialog_width: 1000, advlist_bullet_styles: 'square', advlist_number_styles: 'default', block_formats: '普通标签=p;小标题=h2;', imagetools_cors_hosts: ['wpimg.wallstcn.com', 'wallstreetcn.com'], imagetools_toolbar: 'watermark', default_link_target: '_blank', link_title: false, init_instance_callback: editor => { if (_this.value) { editor.setContent(_this.value) } _this.hasInit = true; editor.on('NodeChange Change KeyUp', () => { this.hasChange = true; this.$emit('input', editor.getContent({ format: 'raw' })); }); }, // 整合七牛上传 // images_dataimg_filter(img) { // setTimeout(() => { // const $image = $(img); // $image.removeAttr('width'); // $image.removeAttr('height'); // if ($image[0].height && $image[0].width) { // $image.attr('data-wscntype', 'image'); // $image.attr('data-wscnh', $image[0].height); // $image.attr('data-wscnw', $image[0].width); // $image.addClass('wscnph'); // } // }, 0); // return img // }, // images_upload_handler(blobInfo, success, failure, progress) { // progress(0); // const token = _this.$store.getters.token; // getToken(token).then(response => { // const url = response.data.qiniu_url; // const formData = new FormData(); // formData.append('token', response.data.qiniu_token); // formData.append('key', response.data.qiniu_key); // formData.append('file', blobInfo.blob(), url); // upload(formData).then(() => { // success(url); // progress(100); // }) // }).catch(err => { // failure('出现未知问题,刷新页面,或者联系程序员') // console.log(err); // }); // }, setup(editor) { editor.addButton('h2', { title: '小标题', // tooltip text seen on mouseover text: '小标题', onclick() { editor.execCommand('mceToggleFormat', false, 'h2'); }, onPostRender() { const btn = this; editor.on('init', () => { editor.formatter.formatChanged('h2', state => { btn.active(state); }); }); } }); editor.addButton('p', { title: '正文', text: '正文', onclick() { editor.execCommand('mceToggleFormat', false, 'p'); }, onPostRender() { const btn = this; editor.on('init', () => { editor.formatter.formatChanged('p', state => { btn.active(state); }); }); } }); } }); }, destroyed() { tinymce.get(this.id).destroy(); } } </script> <style scoped> .tinymce-container { position: relative } .tinymce-textarea { visibility: hidden; z-index: -1; } .editor-custom-btn-container { position: absolute; right: 15px; top: 18px; } .editor-upload-btn { display: inline-block; } </style>