| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 |
- <template>
- <div>
- <textarea :id="Id"></textarea>
- </div>
- </template>
- <script>
- export default {
- data() {
- const Id = Date.now();
- return {
- hasChange: false,
- hasInit: false,
- Id: Id,
- Editor: null,
- DefaultConfig: {
- language: 'zh_CN',
- // GLOBAL
- height: 500,
- 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; }
- `,
- 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: 300
- };
- }
- },
- url: {
- default: "",
- type: String
- },
- accept: {
- default: "image/jpeg,image/png",
- type: String
- },
- maxSize: {
- default: 1024*1024*1000,
- type: Number
- },
- withCredentials: {
- default: false,
- type: Boolean
- }
- },
- watch: {
- value(val) {
- if (!this.hasChange && this.hasInit) {
- this.$nextTick(() =>
- window.tinymce.get(this.tinymceId).setContent(val || ''))
- }
- }
- },
- mounted() {
- this.init();
- },
- beforeDestroy() {
- // 销毁tinymce
- this.$emit("on-destroy");
- window.tinymce.remove(`#${this.Id}`);
- },
- methods: {
- 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();
- xhr.withCredentials = self.withCredentials;
- xhr.open("POST", self.url);
- 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);
- /* eslint-disable-next-line */
- console.log(json);
- success(json.location);
- // 抛出 'on-upload-complete' 钩子
- self.$emit("on-upload-complete", [json, success, failure]);
- };
- formData.append("file", blobInfo.blob());
- xhr.send(formData);
- }
- },
- // prop内传入的的config
- ...this.config,
- // 挂载的DOM对象
- selector: `#${this.Id}`,
- init_instance_callback: (editor) => {
- if (self.value) {
- editor.setContent(self.value)
- }
- self.hasInit = true;
- editor.on('NodeChange Change KeyUp SetContent', () => {
- self.hasChange = true
- this.$emit('input', editor.getContent())
- })
- },
- 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());
- });
- }
- });
- }
- }
- };
- </script>
|