publish_wangEditor.html 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. <div class="layui-form-item layui-form-text">
  2. <label class="layui-form-label">内容</label>
  3. <div class="layui-input-block">
  4. <div id="container"></div>
  5. <textarea name="[field]" id="container1" style="display: none">{notempty name="$[item].[field]"}{$[item]->getData('[field]')}{/notempty}</textarea>
  6. </div>
  7. </div>
  8. <!-- 配置文件 -->
  9. <script type="text/javascript" src="__PUBLIC__/wangEditor/wangEditor4.min.js"></script>
  10. <!-- 实例化编辑器 -->
  11. <script type="text/javascript">
  12. //https://www.wangeditor.com/
  13. const E = window.wangEditor
  14. const editor = new E('#container')
  15. //防止遮盖下拉框
  16. editor.config.zIndex = 500;
  17. //===============================定义图片上传================================//
  18. editor.config.uploadImgServer = "{:url('attachment/upload')}";
  19. editor.config.uploadImgMaxSize = '{$web_config.file_size}' * 1024; // 限制大小
  20. // editor.config.uploadImgAccept = ['jpg']
  21. editor.config.uploadImgMaxLength = 5 // 一次最多上传 5 个图片
  22. editor.config.uploadImgParams = {
  23. use: 'article_content',//自定义 上传参数
  24. }
  25. editor.config.uploadImgHeaders = {'X-Requested-With': 'XMLHttpRequest'} //自定义 header
  26. editor.config.uploadFileName = 'file',//自定义 fileName
  27. editor.config.uploadImgHooks = {
  28. // 图片上传并返回了结果,图片插入已成功
  29. success: function (xhr) {
  30. console.log('success', xhr)
  31. },
  32. // 上传图片超时
  33. timeout: function (xhr) {
  34. console.log('timeout')
  35. },
  36. // 图片上传并返回了结果,想要自己把图片插入到编辑器中
  37. // 例如服务器端返回的不是 { errno: 0, data: [...] } 这种格式,可使用 customInsert
  38. customInsert: function (insertImgFn, result) {
  39. // result 即服务端返回的接口
  40. console.log('customInsert', result)
  41. if (result.code == 1) {
  42. // insertImgFn 可把图片插入到编辑器,传入图片 src ,执行函数即可
  43. insertImgFn(result.data.src)
  44. }else{
  45. alert(result.msg);
  46. }
  47. }
  48. }
  49. //===============================定义图片上传================================//
  50. //
  51. //===============================定义上传视频================================//
  52. // 配置 server 接口地址
  53. editor.config.uploadVideoServer = "{:url('attachment/upload')}";
  54. editor.config.uploadVideoMaxSize = '{$web_config.file_size}' * 1024; // 默认限制视频大小是 1024m ,可以自己修改
  55. // editor.config.uploadVideoAccept = ['mp4']
  56. //考虑到文件较大,所以暂时只允许一个视频上传
  57. editor.config.uploadVideoParams = {
  58. use: 'article_content',//自定义 上传参数
  59. }
  60. editor.config.uploadVideoHeaders = {
  61. 'X-Requested-With': 'XMLHttpRequest' //自定义 header
  62. }
  63. editor.config.uploadVideoName = 'file';//自定义 fileName
  64. editor.config.uploadVideoTimeout = 1000 * 60 * 5; //timeout 即上传接口等待的最大时间,默认是 5分钟,可以自己修改。
  65. editor.config.uploadVideoHooks = {
  66. // 上传视频之前
  67. // before: function(xhr) {
  68. // console.log(xhr)
  69. // // 可阻止视频上传
  70. // return {
  71. // prevent: true,
  72. // msg: '需要提示给用户的错误信息'
  73. // }
  74. // },
  75. // 视频上传并返回了结果,视频插入已成功
  76. success: function (xhr) {
  77. console.log('success', xhr)
  78. },
  79. // 视频上传并返回了结果,但视频插入时出错了
  80. fail: function (xhr, editor, resData) {
  81. console.log('fail', resData)
  82. },
  83. // 上传视频出错,一般为 http 请求的错误
  84. error: function (xhr, editor, resData) {
  85. console.log('error', xhr, resData)
  86. },
  87. // 上传视频超时
  88. timeout: function (xhr) {
  89. console.log('timeout')
  90. },
  91. // 视频上传并返回了结果,想要自己把视频插入到编辑器中
  92. // 例如服务器端返回的不是 { errno: 0, data: { url : '.....'} } 这种格式,可使用 customInsert
  93. customInsert: function (insertVideoFn, result) {
  94. // result 即服务端返回的接口
  95. console.log('customInsert', result)
  96. if (result.code == 1) {
  97. // insertVideoFn 可把视频插入到编辑器,传入视频 src ,执行函数即可
  98. insertVideoFn(result.data.src)
  99. }else{
  100. alert(result.msg);
  101. }
  102. }
  103. }
  104. // 自定义插入视频的形式
  105. // editor.config.customInsertVideo = function (videoUrl) {
  106. // // videoUrl 是返回的视频地址
  107. //
  108. // var thumb = $('#upload_img').attr('src');
  109. // // 往编辑器插入 html 内容
  110. // editor.cmd.do(
  111. // 'insertHTML',
  112. // '<video src="'+videoUrl+'" poster="'+thumb+'" controls="controls" style="max-width:100%"></video>'
  113. // )
  114. // }
  115. //===============================定义上传视频================================//
  116. //
  117. //===============================自定义菜单================================//
  118. //查看源码按钮
  119. class CustomMenu extends E.BtnMenu {
  120. constructor(editor_) {
  121. const $elem = E.$(
  122. '<div class="w-e-menu" data-title="查看源码"><a href="javaScript:;" id="menu_y" class=""><i class="layui-icon">&#xe64e;</i></a></div>'
  123. )
  124. super($elem, editor_)
  125. }
  126. // 点击事件
  127. clickHandler() {
  128. var editorHtml = editor.txt.html();
  129. if ($("#menu_y").attr("class") == "active_y") {
  130. $("#menu_y").attr("class", "")
  131. editorHtml = editor.txt.text().replace(/&lt;/ig, "<").replace(/&gt;/ig, ">").replace(/&nbsp;/ig, " ");
  132. } else {
  133. $("#menu_y").attr("class", "active_y")
  134. editorHtml = editorHtml.replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/ /g, "&nbsp;");
  135. }
  136. editor.txt.html(editorHtml);
  137. // editor.change && editor.change();
  138. }
  139. //激活状态
  140. tryChangeActive() {
  141. if ($("#menu_y").attr("class") == "active_y") {
  142. this.active();//会增加一个 .w-e-active 的 css class
  143. } else {
  144. this.unActive();//会删掉 .w-e-active
  145. }
  146. }
  147. }
  148. // 注册菜单
  149. const customMenuKey = 'customMenuKey';
  150. editor.menus.extend('customMenuKey', CustomMenu);
  151. editor.config.menus = editor.config.menus.concat(customMenuKey);
  152. //===============================自定义菜单================================//
  153. //清除格式
  154. class ClearMenu extends E.BtnMenu {
  155. constructor(editor_) {
  156. const $elem = E.$(
  157. '<div class="w-e-menu" data-title="清除格式"><a href="javaScript:;" id="clear_css" class=""><i class="layui-icon"></i></a></div>'
  158. )
  159. super($elem, editor_)
  160. }
  161. // 点击事件
  162. clickHandler(value) {
  163. var editor = this.editor;
  164. var isSeleEmpty = editor.selection.isSelectionEmpty();
  165. var selectionText = editor.selection.getSelectionText();
  166. if (!isSeleEmpty) {
  167. editor.cmd.do('insertHTML', selectionText);
  168. }
  169. }
  170. tryChangeActive() {
  171. //没有激活状态
  172. }
  173. }
  174. // 注册菜单
  175. const clearMenu = 'clearMenu';
  176. editor.menus.extend('clearMenu', ClearMenu);
  177. editor.config.menus = editor.config.menus.concat(clearMenu);
  178. //===============================自定义菜单================================//
  179. //实例化
  180. const $text1 = $('#container1');
  181. editor.config.onchange = function (html) {
  182. $text1.val(html)// 第二步,监控变化,同步更新到 textarea
  183. }
  184. editor.create()
  185. editor.txt.html($text1.val()) // 第一步,初始化编辑器内容
  186. </script>
  187. <script>
  188. //提交表单前调用此函数,还原预览代码
  189. function beforeSubmit() {
  190. // console.log('before submit')
  191. if ($("#menu_y").attr("class") == "active_y") {
  192. $("#menu_y").attr("class", "")
  193. var editorHtml = editor.txt.text().replace(/&lt;/ig, "<").replace(/&gt;/ig, ">").replace(/&nbsp;/ig, " ");
  194. $text1.val(editorHtml);
  195. }
  196. }
  197. </script>