var MultiEditor = {
puid: '',
yunToken: '',
prdid: '442',//产品号,云盘那边给我们分配的,区分数据是那个团队传过去的
isPhone: false, //是否是移动端
idList: [],//编辑器id列表,防止重复调用initEditor
hasLoadAttachListener: false, //是否加载了附件监听js
nowDomain: '',//引用当前js的域名
noteDomain: 'https://noteyd.chaoxing.com',//默认的js前缀
passport2Domain: 'https://passport2.chaoxing.com',
hasLoadedEditor: false, //编辑器是否加载完成
init: function () {
type, ua, options
}, //加载配置文件
initEditor: function (json, callback, changecallback) {
}, //编辑页初始化编辑器
loadJSFile: function (src, cb) {
},
getRichText: function (editorid) {
}, // 获取富文本内容
setRichText: function (editorid, content) {
}, // 设置富文本内容
renderRichtext: function (editorId, content, ua) {
}, //详情页渲染富文本内容
getUploadConfig: function (editorId) {
}, //获取上传信息
unescapeHTML: function (content) {
}, //还原html脚本
randomUUID: function () {
}, //生成随机id
pcLoadProfile: function () {
},//加载PC配置文件
loadUE: function (editorid, cb) {
},//加载完编辑器
focus: function () {
},//光标定到编辑器
insertHTML: function (editorid, html) {
},//插入到编辑器
insertTeacherCommentAttach: function (editorid, data) {
},//题目编辑器-插入教师批注附件
execCommand: function (editorid, cmd, data) {
},//编辑器-执行命令
destoryEditor: function (editorid) {
}, //销毁编辑器
hasLoadEditFile: false, //是否已经加载过编辑页配置文件
hasLoadDetailFile: false, //是否已经加载过详情页配置文件
hasLoadRichTextUitl: false, //是否已经加载过Richtextutil文件
intranetMode: false,//镜像编辑器,不是镜像笔记
options: {},//传过来的参数
mirrorDomainList:{},//镜像接口获取的域名信息
mirrorPanDomain:'',//云盘镜像地址
mirrorPhotoDomain:'',//图片服务镜像地址
isMirrorDeploy:'',//是镜像笔记服务
isFileDownloadPageJump: false, // 是否是下载文件触发的页面跳转
}
/*加载配置文件
*type: edit 或者 detail
* ua: 指定是app还是pc
* options: isIntranetMode:是否是镜像模式
* prefix 前缀
* */
MultiEditor.init = function (type, ua, options) {
var uaInfor = navigator.userAgent.toLowerCase();
if (/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) || navigator.userAgent.indexOf('harmony') > -1) {
MultiEditor.isPhone = true;
} else if (ua == 'app') {
MultiEditor.isPhone = true;
}
if (options) {
MultiEditor.options = options;
}
//如果已经加载过,不再加载配置文件
if (type == 'edit') {
if (MultiEditor.hasLoadEditFile) {
return;
}
MultiEditor.hasLoadEditFile = true;
} else if (type == 'detail') {
if (MultiEditor.hasLoadDetailFile) {
return;
}
MultiEditor.hasLoadDetailFile = true;
}
if (MultiEditor.currentHref && MultiEditor.currentHref.indexOf('bistatic-') > -1) {
MultiEditor.noteDomain = window.location.protocol + '//bistatic-' + MultiEditor.noteDomain.replace('http:','').replace('https:','');
}
let prefix = ''
if (options && options.isIntranetMode) {
//是镜像
MultiEditor.intranetMode = true;
if (options && options.prefix) {
MultiEditor.prefix = options.prefix;
} else {
MultiEditor.prefix = 'ueditor4thirdparty/';
}
prefix = MultiEditor.prefix;
MultiEditor.isPhone = false; //镜像还没有支持移动端
} else {
if (options && options.prefix) {
MultiEditor.prefix = options.prefix;
} else {
MultiEditor.prefix = window.location.protocol + '//' + MultiEditor.nowDomain;
}
prefix = MultiEditor.prefix + '/res/plugin/ueditor4thirdparty/'
}
if (MultiEditor.isPhone) { //移动端
if(!window.obj){
window.obj = {};
}
if(window.location.host.indexOf('chaoxing.com') == -1){
//非超星域名获取镜像域名列表
MultiEditor.getMirrorDomain();
}
if (ua == 'xxt' && uaInfor.indexOf("chaoxingstudy") != -1) {
MultiEditor.loadJSFile(MultiEditor.prefix + '/res/plugin/meditor/js/mrich.text.util.js?_t=' + new Date().getTime(), function () {
if (type == 'edit') {
MrichTextUitl.loadEditorProfile2();
} else if (type == 'detail') {
MrichTextUitl.loadDetailPageProfile2();
}
});
} else {
//防止attachment_listener加载多次
if (MultiEditor.hasLoadAttachListener == false && typeof AttachmentListener == 'undefined') {
MultiEditor.loadJSFile(MultiEditor.prefix + '/res/pc/js/noteRichtext/attachment_listener.js?_t=' + new Date().getTime())
AttachmentListener = {};
MultiEditor.hasLoadAttachListener = true;
}
if (type == 'edit') {
MultiEditor.loadJSFile(MultiEditor.prefix + '/res/plugin/meditor/js/mrich.text.util.js?_t=' + new Date().getTime(), function () {
for (var key in MultiEditor.options) {
MrichTextUitl[key] = MultiEditor.options[key];
}
MrichTextUitl.loadMoreEditorProfile();
});
} else if (type == 'detail') {
MultiEditor.loadJSFile(MultiEditor.prefix + '/res/plugin/ueditor4thirdparty/rich.text.util.js?_t=', function () {
MultiEditor.pcLoadProfile(type);
})
}
}
} else { //PC
//防止attachment_listener加载多次
if (MultiEditor.hasLoadAttachListener == false && typeof AttachmentListener == 'undefined') {
MultiEditor.loadJSFile(MultiEditor.prefix + '/res/pc/js/noteRichtext/attachment_listener.js?_t=' + new Date().getTime())
AttachmentListener = {};
MultiEditor.hasLoadAttachListener = true;
}
if (typeof RichTextUitl == 'undefined') {
if (MultiEditor.hasLoadRichTextUitl) {
//防止两次调用期间js还没加载完成
var timer = setInterval(function () {
if (typeof RichTextUitl != 'undefined') {
clearInterval(timer)
MultiEditor.pcLoadProfile(type);
}
}, 500);
} else {
MultiEditor.hasLoadRichTextUitl = true;
MultiEditor.loadJSFile(prefix + 'rich.text.util.js?_t=', function () {
MultiEditor.pcLoadProfile(type);
})
}
} else {
MultiEditor.pcLoadProfile(type);
}
}
}
//获取镜像域名
MultiEditor.getMirrorDomain = function(){
if (typeof jQuery != 'undefined') {
var json = {
url: MultiEditor.prefix + '/apis/mirrorConfig',
type: "get",
xhrFields: {
withCredentials: true
},
data: {},
dataType: "json",
success: function (res) {
if(res.result){
let result = res.data
MultiEditor.mirrorDomainList = result.domainMap;
for(var key in MultiEditor.mirrorDomainList){
if(MultiEditor.mirrorDomainList[key]){
MultiEditor.mirrorDomainList[key] = window.location.protocol + MultiEditor.mirrorDomainList[key].replace('https:','').replace('http:','')
}
}
MultiEditor.isMirrorDeploy = result.isMirrorDeploy;
window.obj.mirrorDomain = MultiEditor.mirrorDomainList;
window.obj.mirrorDomain.isMirrorDeploy = result.isMirrorDeploy
MultiEditor.noteDomain = MultiEditor.mirrorDomainList.NoteDomainHttps
MultiEditor.mirrorPanDomain = MultiEditor.mirrorDomainList.panDomainHttps
MultiEditor.mirrorPhotoDomain = MultiEditor.mirrorDomainList.photoDomainHttps
MultiEditor.passport2Domain = MultiEditor.mirrorDomainList.passport2DomainHttps
}
},
error: function () {
}
}
// 同步调用
json.async = false;
$.ajax(json);
}
}
//加载PC配置文件
MultiEditor.pcLoadProfile = function (type) {
RichTextUitl.ismultiEditor = true;
if (MultiEditor.options) {
for (var key in MultiEditor.options) {
RichTextUitl[key] = MultiEditor.options[key];
}
if (MultiEditor.intranetMode) {
RichTextUitl.intranetMode = true;
}
RichTextUitl.prefix = MultiEditor.prefix
// 查看大图时是否可编辑 默认为false
if(MultiEditor.options.isEditableViewLargeImage === true) {
RichTextUitl.isEditableViewLargeImage = true
}
}
//提前加载js,避免ueditor报错
if (MultiEditor.intranetMode) {
MultiEditor.loadJSFile(MultiEditor.prefix + 'rich.text.common.js');
} else if (MultiEditor.prefix) {
MultiEditor.loadJSFile(MultiEditor.prefix + '/res/pc/js/noteRichtext/rich.text.common.js');
} else {
MultiEditor.loadJSFile(window.location.protocol + '//' + MultiEditor.nowDomain + '/res/pc/js/noteRichtext/rich.text.common.js');
}
if (type == 'edit') {
RichTextUitl.loadEditorProfile(true, true)
} else if (type == 'detail') {
RichTextUitl.loadDetailPageProfile(true, true, false, false, true);
}
}
/*
* param editorid: 编辑器id、
* param content: 富文本内容、
* param editorheight: 初始高度
* param callback:回调方法(编辑器加载完成后的回调)
* param changecallback: 监听内容改变的时候回调
*/
MultiEditor.initEditor = function (json, callback, changecallback) {
var editorid = json.editorid;
if (/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) || navigator.userAgent.indexOf('harmony') > -1) {
MultiEditor.isPhone = true;
}
if (MultiEditor.isPhone) { //移动端
var loadfiletimer = setInterval(function () {
if (typeof (MrichTextUitl) != 'undefined' && typeof (zss_editor) != 'undefined' && $('body').length > 0) {
clearInterval(loadfiletimer);
MrichTextUitl.initMoreEditor(json, callback, changecallback);
if (typeof callback == 'function') {
callback();
MultiEditor.hasLoadedEditor = true;
}
}
}, 500)
} else { //PC
//不允许同一个id多次初始化
if (MultiEditor.idList.indexOf(editorid) > -1) {
return;
}
MultiEditor.idList.push(editorid);
// if (document.getElementById(editorid) && document.getElementById(editorid).querySelector('.edui-editor')) {
// //已经初始化过的,不再初始化
// return;
// }
document.getElementById(editorid).innerHTML = '';
var loadfiletimer = setInterval(function () {
if (typeof (RichTextUitl) != 'undefined' && typeof (UE) != "undefined" && typeof (UE.getEditor) != "undefined") {
clearInterval(loadfiletimer);
RichTextUitl.initMoreUEditor(json, callback, changecallback);
MultiEditor.hasLoadedEditor = true;
}
}, 500)
}
}
//编辑页插入编辑器内容
MultiEditor.setRichText = function (editorid, content) {
if (MultiEditor.isPhone) { //移动端
if(typeof MrichTextUitl == 'undefined'){
console.log('请等待编辑器加载完成...')
return
}
content = MrichTextUitl.beforeSetRtfContent(content,{type:'edit'});
MrichTextUitl.setRichtext({'content': content}, editorid);
} else { //PC
if(typeof RichTextUitl == 'undefined'){
console.log('请等待编辑器加载完成...')
return
}
content = RichTextUitl.beforeSetRtfContent(content,{type:'edit'});
MultiEditor.loadUE(editorid, function (editor) {
editor.setContent(content);
})
}
}
/*插入富文本内容
* editorid 编辑器id
* cmd 命令
* data Object类型
* */
MultiEditor.insertHTML = function (editorid, html) {
if (MultiEditor.isPhone) { //移动端
html = MrichTextUitl.beforeSetRtfContent(html);
} else {
html = RichTextUitl.beforeSetRtfContent(html);
}
MultiEditor.execCommand(editorid, 'inserthtml', html);
}
/*执行编辑器内部命令
* editorid 编辑器id
* cmd 命令
* data
* */
MultiEditor.execCommand = function (editorid, cmd, data) {
if (MultiEditor.isPhone) { //移动端
if (typeof (zss_editor) != 'undefined' && $('body').length > 0) {
zss_editor.updateEnterRange(editorid);
zss_editor.insertHTML(data)
zss_editor.backupRange();
}
} else { //PC
MultiEditor.loadUE(editorid, function (editor) {
editor.execCommand(cmd, data);
})
}
}
//移动端插入图片
MultiEditor.insertImage = function (editorid, imgurl, objectId) {
if (MultiEditor.isPhone) { //移动端
if (typeof (zss_editor) != 'undefined' && $('body').length > 0) {
zss_editor.updateEnterRange(editorid);
zss_editor.insertImage(imgurl, objectId, '', '', true);
}
}
}
MultiEditor.getEditor = function (editorid) {
var editor = UE.getEditor('multi' + editorid);
return editor;
}
//编辑器加载完成事件后回调
MultiEditor.loadUE = function (editorid, cb) {
if (typeof (UE) == 'undefined') {
var loadfiletimer = setInterval(function () {
if (typeof (UE) != 'undefined') {
clearInterval(loadfiletimer);
var editor = UE.getEditor('multi' + editorid);
if (typeof (editor.body) == 'undefined') {
var loadfiletimer2 = setInterval(function () {
if (typeof (editor.body) != 'undefined') {
clearInterval(loadfiletimer2);
if (cb) cb(editor)
}
}, 500)
} else {
if (cb) cb(editor)
}
}
}, 500)
} else {
var editor = UE.getEditor('multi' + editorid);
if (typeof (editor.body) == 'undefined') {
var loadfiletimer2 = setInterval(function () {
if (typeof (editor.body) != 'undefined') {
clearInterval(loadfiletimer2);
if (cb) cb(editor)
}
}, 500)
} else {
if (cb) cb(editor)
}
}
}
//编辑页获取编辑器内容
MultiEditor.getRichText = function (editorid) {
if (MultiEditor.isPhone) { //移动端
return MrichTextUitl.getRichtextObj(editorid)
} else { //PC
if (typeof (UE) == 'undefined' || typeof UE.getEditor('multi' + editorid).body == "undefined") {
console.log('编辑器未加载完成,请稍后再获取数据')
return null;
} else {
var richtext = RichTextUitl.getRichText(null, 'multi' + editorid);
if (!richtext) {
richtext = {attachment: "", content: "", content_imgs: "", rtf_content: "", isuploading: true,hasUploadFailed:''}
}
return richtext;
}
}
}
/**详情页渲染富文本内容
* param richtextId 文本容器的id
* param content 文本内容
* param ua 浏览器
* params options 其他参数
*/
MultiEditor.renderRichtext = function (richtextId, content, ua, options) {
if (/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) || navigator.userAgent.indexOf('harmony') > -1 && navigator.userAgent.indexOf('phone') > -1) {
MultiEditor.isPhone = true;
}
var uaInfor = navigator.userAgent.toLowerCase();
if (ua == 'xxt' && uaInfor.indexOf("chaoxingstudy") != -1) {
if (typeof (MrichTextUitl) == 'undefined') {
var loadfiletimer = setInterval(function () {
if (typeof (MrichTextUitl) != 'undefined') {
clearInterval(loadfiletimer);
zss_editor.changeClientType();
zss_editor.init();
//渲染富文本内容
MrichTextUitl.insertDetailContent(content);
}
}, 500)
} else {
zss_editor.changeClientType();
zss_editor.init();
//渲染富文本内容
MrichTextUitl.insertDetailContent(content);
}
} else {
if (typeof (RichTextUitl) == 'undefined' || typeof (RichTextUitl.b64DecodeUnicode) == 'undefined') {
var loadfiletimer = setInterval(function () {
if (typeof (RichTextUitl) != 'undefined' && typeof (RichTextUitl.b64DecodeUnicode) != 'undefined') {
clearInterval(loadfiletimer);
MultiEditor.pcLoadRichText(richtextId, content, options)
}
}, 500)
} else {
MultiEditor.pcLoadRichText(richtextId, content, options)
}
}
// 详情页是否显示图片边框
if(MultiEditor.options && MultiEditor.options.showImageBorder === false) {
$('#' + richtextId).attr('show-image-border', false)
}
}
// pc中js加载完成后的操作
MultiEditor.pcLoadRichText = function (richtextId, content, options) {
if(options && options.catalogDiv) {
RichTextUitl.catalogDiv = options.catalogDiv
}
if(options && typeof options.catalogOptions != 'undefined') {
RichTextUitl.catalogOptions = options.catalogOptions
}
if(options && typeof options.isAutoPlayVideo != 'undefined') {
RichTextUitl.isAutoPlayVideo = options.isAutoPlayVideo
}
content = RichTextUitl.beforeSetRtfContent(content);
document.getElementById(richtextId).innerHTML = content;
RichTextUitl.afterPageRendered(document.getElementById(richtextId),options);
}
//获取编辑器对象,编辑器加载完成后调用
MultiEditor.focus = function (richtextId, toEnd) {
if (MultiEditor.isPhone) {
$('#' + richtextId).find('.editor_main').focus()
} else {
MultiEditor.loadUE(richtextId, function (editor) {
editor.focus(toEnd);
});
}
}
//销毁编辑器
MultiEditor.destoryEditor = function (editorid) {
$('#' + editorid).empty();
MultiEditor.idList.splice(MultiEditor.idList.indexOf(editorid), 1)
if (!MultiEditor.isPhone && typeof (UE) != 'undefined' && typeof UE.getEditor('multi' + editorid).body != "undefined") {
UE.getEditor('multi' + editorid).destroy();
}
}
//编辑器markdown转html
MultiEditor.insertMarkdown = function (editorid, text) {
if(MultiEditor.isPhone){
var html = MrichTextUitl.markDownToHtml(text);
MultiEditor.insertHTML(editorid, html);
}else{
UE.getEditor('multi' + editorid).execCommand('inserthtml', RichTextUitl.markDownToHtml(text));
}
}
//修改PC编辑器内容 id为dom查询条件,如#id,text为要修改的内容
MultiEditor.updatePCEditorText = function (editorid, id, text) {
var editor = MultiEditor.getEditor(editorid)
if(editor){
editor.body.querySelector(id).innerText = text;
editor.fireEvent('contentchange');
editor.fireEvent('saveScene');
}
}
//修改PC编辑器内容 id为dom查询条件,如#id,html为要修改的内容
MultiEditor.updatePCEditorHTML = function (editorid, id, html) {
var editor = MultiEditor.getEditor(editorid)
if(editor){
editor.body.querySelector(id).outerHTML = html;
editor.fireEvent('contentchange');
editor.fireEvent('saveScene');
}
}
//移动光标至指定节点后面
MultiEditor.moveCursorAfterNode = function (editor, node) {
// 获取当前选区
var range = editor.selection.getRange();
// 获取当前光标所在的节点
var currentNode = range.startContainer;
// 将光标移动到span标签的后面
range.setStartAfter(node);
range.collapse(true).select(); // 设置新的选区
}
/*题目编辑器 - 插入教师批注附件
* editorid:编辑器id
* data:json对象,示例{data1:'xxx',data2:'xxx'},data1 data2是课程业务数据的id 作答记录 题目
* */
MultiEditor.insertTeacherCommentAttach = function (editorid, data) {
var cid = MultiEditor.randomUUID();
var json = {
"att_web": {
"content": "",
"logo": window.location.protocol + "//mooc2-ans.chaoxing.com/mooc2-ans/module/work/images/viewAttach.png",
"title": '教师批注',
"url": '',
data1: data.data1,
data2: data.data2,
},
"attachmentType": 25,
"cid": cid
}
var html = "