在UEditor编辑器的工具栏上加一行文字或按钮
微wx笑 2022-01-23【网页网站】 3 0关键字: UEditor 编辑器
有时候我们可能需要在UEditor编辑器的工具栏上加一行文字或按钮,用来提示一些信息,当前一些耗时操作的状态,比如远程图片的抓取。
之前遇到一个问题:百度UEditor粘贴内容包含大量远程图片抓取失败的问题
问题虽然解决了,但是并不完美,很多状态提示信息是通过控制台输出的,不打开开发者工具根本看不到,使用体验比较差,于是就想到在工具栏上添加一个输出提示信息的功能。
完成后的效果:
示例代码:
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/> <title></title> <script type="text/javascript" charset="utf-8" src="../ueditor.config.js"></script> <script type="text/javascript" charset="utf-8" src="editor_api.js"></script> <script type="text/javascript" charset="utf-8" src="../../js/jquery-1.9.1.min.js"></script> </head> <body> <h1>UEditor简单功能</h1> <!--style给定宽度可以影响编辑器的最终宽度--> <script type="text/plain" id="myEditor"> <p>这里我可以写一些输入提示</p> </script> <script type="text/javascript"> var ue = UE.getEditor('myEditor',{ //这里可以选择自己需要的工具按钮名称,此处仅选择如下五个 toolbars:[['insertimage']], //focus时自动清空初始化时的内容 autoClearinitialContent:true, //关闭字数统计 wordCount:false, //关闭elementPath elementPathEnabled:false, //默认的编辑区域高度 initialFrameHeight:300 //更多其他参数,请参考ueditor.config.js中的配置项 }); ue.ready(function () { $(".edui-toolbar").append('<div style="float:left;">请点击按钮上传图片</div>'); }); </script> </body> </html>
有时候可能不只是需要添加文字的提示信息,还需要添加按钮操作,以下代码是写在UEditor代码内部的:
function catchremoteimageGetTip(){ var upload_tip = $("#edui_upload_tip"); if (upload_tip.length == 0){ $(".edui-toolbar").append('<div id="edui_upload_tip" class="edui-box edui-default" style="padding: 5px;"></div>'); upload_tip = $("#edui_upload_tip"); } return upload_tip; } function catchremoteimageRetry(){ var upload_tip = catchremoteimageGetTip(); if (upload_tip.length > 0){ var retry = $("<a>重试</a>"); $(retry).click(function(){ me.fireEvent("catchRemoteImage"); }); upload_tip.append(" "); upload_tip.append(retry); }else{ console.log("catchremoteimageTip,无法获取或创建edui_upload_tip引用"); } }
代码的功能是在工具栏的后面添加一个id="edui_upload_tip"的div用于显示提示信息,
如果调用“catchremoteimageRetry()”,还可以在后面添加一个重试的按钮,功能是重新调用远程图片的抓取。
下面的代码是提示信息的处理:
function catchremoteimageTip(tipStr, callbackInfo) { //本方法用于在工具栏上显示抓取远程图片的提示信息 if (typeof tipStr == 'undefined'){ return; } var upload_tip = catchremoteimageGetTip(); if (upload_tip.length > 0){ if (typeof callbackInfo == 'undefined'){ upload_tip.text(tipStr); }else{ if (tipStr.length > 0){ tipStr += ","; } if (callbackInfo.state && callbackInfo.state == 'SUCCESS'){ var listCount = 0; for (var i = 0; i < callbackInfo.list.length; i++){ if (callbackInfo.list[i].state == "SUCCESS"){ listCount++; } } remoteImagesLength -= listCount; if (listCount == callbackInfo.list.length){ if (remoteImagesLength < 1){ upload_tip.text(tipStr+ "本次成功" + listCount + "张,全部抓取完成"); }else{ upload_tip.text(tipStr+ "本次成功" + listCount + "张,剩余" + remoteImagesLength + "张"); } }else{ upload_tip.text(tipStr+ "本次成功" + listCount + "张,失败" + (callbackInfo.list.length - listCount) + "张"); } }else{ upload_tip.text(tipStr+ "服务器返回失败,详情请查看控制台输出"); } } }else{ console.log("catchremoteimageTip,无法获取或创建edui_upload_tip引用"); } }
抓取事件处理函数
me.addListener("catchRemoteImage", function () { var catcherLocalDomain = me.getOpt('catcherLocalDomain'), catcherActionUrl = me.getActionUrl(me.getOpt('catcherActionName')), catcherUrlPrefix = me.getOpt('catcherUrlPrefix'), catcherFieldName = me.getOpt('catcherFieldName'); var remoteImages = [], imgs = domUtils.getElementsByTagName(me.document, "img"), test = function (src, urls) { if (src.indexOf(location.host) != -1 || /(^\.)|(^\/)/.test(src)) { return true; } if (urls) { for (var j = 0, url; url = urls[j++];) { if (src.indexOf(url) !== -1) { return true; } } } return false; }; for (var i = 0, ci; ci = imgs[i++];) { if (ci.getAttribute("word_img")) { continue; } var src = ci.getAttribute("_src") || ci.src || ""; if (/^(https?|ftp):/i.test(src) && !test(src, catcherLocalDomain)) { remoteImages.push(src); } } catchremoteimageTip(remoteImages.length + " 张图片待抓取"); if (remoteImages.length) { console.log("remoteImages.length",remoteImages.length); console.log("开始分段抓取远程图片......"); if (remoteImagesLength == 0){ catchremoteimageTip("开始分段抓取,总计" + remoteImages.length + "张"); remoteImagesLength = remoteImages.length; }else{ catchremoteimageTip("分段抓取中,剩余" + remoteImages.length + "张"); } var pk = 0; //while (pk < remoteImages.length){ var imgPart = [],pkBegin = pk; for (var k = 0; k < 5; k++){ if (pk < remoteImages.length){ imgPart.push(remoteImages[pk]); pk++; } } console.log("imgPartBegin", pkBegin, "End", pk); if (imgPart.length) { console.log("imgPart", imgPart); catchremoteimage(imgPart, { //成功抓取 success: function (r) { try { var info = r.state !== undefined ? r:eval("(" + r.responseText + ")"); console.log("info", info); catchremoteimageTip("", info); } catch (e) { catchremoteimageTip("r.responseText转换json对象失败"); catchremoteimageRetry(); console.log(e); return; } /* 获取源路径和新路径 */ var i, j, ci, cj, oldSrc, newSrc, list = info.list,succecsCount = 0; for (i = 0; ci = imgs[i++];) { oldSrc = ci.getAttribute("_src") || ci.src || ""; for (j = 0; cj = list[j++];) { if (oldSrc == cj.source.replace(/&/ig, "&") && cj.state == "SUCCESS") { //抓取失败时不做替换处理 succecsCount++; newSrc = catcherUrlPrefix + cj.url; domUtils.setAttributes(ci, { "src": newSrc, "_src": newSrc }); break; } } } me.fireEvent('catchremotesuccess'); if (succecsCount == 0){ catchremoteimageTip("本次抓取全部失败"); catchremoteimageRetry(); }else{ setTimeout(function(){ me.fireEvent("catchRemoteImage"); },2000); } }, //回调失败,本次请求超时 error: function () { me.fireEvent("catchremoteerror"); catchremoteimageTip("图片抓取失败,请求超时"); catchremoteimageRetry(); } }); } //} }else{ remoteImagesLength = 0; }
本文由 微wx笑 创作,采用 署名-非商业性使用-相同方式共享 4.0 许可协议,转载请附上原文出处链接及本声明。
原文链接:https://www.ivu4e.cn/blog/web/2022-01-23/966.html