1. vscode
1. vue 2. javaScript
1. npm install tinymce -S 2. 能夠使用裏面的文件, 下載後能夠在node_modules 裏面查看以下未目錄結構
3. 能夠將整個結構拷在static裏面,爲了節省打包後的文件大小能夠將tinymce.min.js以cdn方式導入放在index.html中 <script src="https://cdnjs.cloudflare.com/ajax/libs/tinymce/4.7.5/tinymce.min.js"></script> 4. 附上封裝的代碼能夠直接導入使用 <template>
<div>css
<textarea :id="Id"></textarea>
</div>
</template>
<script>
import "tinymce/langs/zh_CN.js"; // 引入中文包地址
// import axios from "axios"; // 可導入axios文件進行上傳圖片
export default {
data() {html
const Id = Date.now(); return { Id: Id, // 構造tinymce的選擇器 Editor: null, tinymceConfig: { // 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, skin_url: "/static/tinymce/skins/lightgray", // 能夠把node_modules 下面的文件導入到static而後引入到這裏 language_url: "/static/tinymce/langs/zh_CN.js", // 導入中文包 language: "zh_CN", // 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: {vue
value: { default: "", type: String }, config: { type: Object, default: () => { return { theme: "modern", height: 300 }; } }, // 該參數就是上傳文件的url url: { default: "", type: String }, //上傳文件類型 accept: { default: "image/jpeg, image/png, image/jpg,", type: String }, maxSize: { default: 2097152, type: Number }, withCredentials: { default: false, type: Boolean }
},
mounted() {java
this.init();
},
beforeDestroy() {node
// 銷燬tinymce // window.tinymce.remove(`$#{this.Id}`)
},
methods: {ios
init() { const self = this; this.Editor = window.tinymce.init({ // 默認配置 ...this.tinymceConfig, // 圖片上傳 images_upload_handler: function(blobInfo, success, failure, progress) { if (blobInfo.blob().size > self.maxSize) { failure("文件體積過大"); } if (self.accept.indexOf(blobInfo.blob().type) > -1) { uploadPic(); } else { failure("圖片格式錯誤"); } function uploadPic() { // 用axios 上傳文件 // progress(0); // let param = new FormData(); // let config = { // headers: { // "Content-Type": "multipart/form-data" // } // }; // param.append("file", blobInfo.blob()); // console.log('axios', axios); // axios // .post("http://operate-dev.winchaingroup.com/api/upload", param, config) // .then(response => { // success(response.data.data); // self.$emit("on-upload-complete", [json, success, failure]); // progress(100); // }) // .catch(error => { // console.log("err", error); // }); // 用ajax上傳文件 const xhr = new XMLHttpRequest(); let createFrom = document.createElement("form"); let FromData = new FormData(createFrom); xhr.withCredentials = self.withCredentials; xhr.open("POST", self.url); xhr.onload = function() { if (xhr.status !== 200) { // 拋出 'on-upload-fail' 鉤子 failure("上傳失敗: " + xhr.status); return; } const json = JSON.parse(xhr.responseText); // success函數中的參數就是你上傳文件返回的url success(json.data); progress(100); // 拋出 'on-upload-complete' 鉤子 }; FromData.append("file", blobInfo.blob()); xhr.send(FromData); } }, // prop內傳入的的config ...this.config, // 掛載的DOM對象 selector: `#${this.Id}`, setup: editor => { // 拋出 'on-ready' 事件鉤子 editor.on("init", () => { self.loading = false; editor.setContent(self.value); }); // 拋出 'input' 事件鉤子,同步value數據 editor.on("input change undo redo", () => {}); } }); }
}
};
</script>web
5. 在組件中導入便可使用 import tinymce from './tinymce/index'
https://www.bootcdn.cn/tinymce/ // tinymce地址