概览
媒体插件为用户增加了将 HTML5 视频和音频元素添加到可编辑区域的能力。它还在“插入”菜单下添加了“插入/编辑视频”项目以及工具栏按钮。
由于,是之前老项目的 tinymce,对其进行相关的优化,并且不影响老项目其他引用模块,只对相应的 media 上传进行设置。
本文主要针对【media 的基本配置】、【视频不能正常显示 bug】、【视频不能选中删除的 bug】、以及【自定义上传】进行描述和解决。
需要注意的是本文针对的 tinymce 版本是 v4,其他高版本不一定适用。
基本设置 这里的基本设置,是配置 tinymce 需要配置的工具。初始化时,必须的属性
selector :tinymce 需要配置的相应 html,如’#tinydemo4’
plugins: 必须的插件
toolbar:必须的工具栏
1 2 3 4 5 6 tinymce.init ({ selector : 'textarea' , plugins : 'media' , menubar : 'insert' , toolbar : 'media' , })
额外设置 开启此选项后,用户可看到编辑区内嵌入视频的实时预览,而不是占位图。取值: true / false 默认: true 此设置对 video 无效
audio_template_callback 自定义插入音频代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 tinymce.init ({ selector : '#tinydemo' , plugins : 'media' , toolbar : 'media' , audio_template_callback : function (data ) { return ( '<audio controls>' + '\n<source src="' + data.source1 + '"' + (data.source1mime ? ' type="' + data.source1mime + '"' : '' ) + ' />\n' + '</audio>' ) }, })
video_template_callback 自定义插入视频代码 很多文章都是如此配置,但是会出现下面的问题:
视频不展示,无法在 tinymce 编辑器播放
视频不能像图片一样进行删除
解决视频选中,删除问题的方法 利用 media_url_resolver 进行返回
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 media_live_embeds : true , media_url_resolver : (data, resolve ) => { try { let videoUri = encodeURI (data.url ); console .log ('media_url_resolverdata===========' , data); let embedHtml = `<p class="mce-preview-object mce-object-video" contenteditable="false" data-mce-object="video" data-mce-p-allowfullscreen="allowfullscreen" data-mce-p-frameborder="no" data-mce-p-scrolling="no" data-mce-p-src=${videoUri} > <video src=${data.url} width="100%" height="auto" controls="controls"> <source src="${data.url} "/> </video> <br data-mce-bogus="1"> </p>` ; resolve ({ html : embedHtml }); } catch (e) { resolve ({ html : '' }); } },
自定义文件上传 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 tinymce.init ({ selector : '#tinydemo4' , language : 'zh_CN' , plugins : 'link' , toolbar : 'link' , file_picker_callback : function (callback, value, meta ) { var filetype = '.pdf, .txt, .zip, .rar, .7z, .doc, .docx, .xls, .xlsx, .ppt, .pptx, .mp3, .mp4' var upurl = '/demo/upfile.php' switch (meta.filetype ) { case 'image' : filetype = '.jpg, .jpeg, .png, .gif' upurl = 'upimg.php' break case 'media' : filetype = '.mp3, .mp4' upurl = 'upfile.php' break case 'file' : default : } var input = document .createElement ('input' ) input.setAttribute ('type' , 'file' ) input.setAttribute ('accept' , filetype) input.click () input.onchange = function ( ) { var file = this .files [0 ] var xhr, formData console .log (file.name ) xhr = new XMLHttpRequest () xhr.withCredentials = false xhr.open ('POST' , upurl) xhr.onload = function ( ) { var json if (xhr.status != 200 ) { failure ('HTTP Error: ' + xhr.status ) return } json = JSON .parse (xhr.responseText ) if (!json || typeof json.location != 'string' ) { failure ('Invalid JSON: ' + xhr.responseText ) return } callback (json.location ) } formData = new FormData () formData.append ('file' , file, file.name ) xhr.send (formData) } }, })
参考链接