📄 coreeditor.js
字号:
/*
By Hangring
#2007.11.02#
---
use list:
> global.lib.js
> string.lib.js
> browser.lib.js
> css.lib.js
> node.lib.js
> events.lib.js
> url.lib.js
---
编辑器核心
*/
var cEditor = {
// 名称,用于引用父窗口的文本域,标记唯一性
Name : Url.QS()['Name'],
// 当前窗口所在父窗口中的iframe的id
FrameName : Url.QS()['FrameName'],
// 初始值模式
TMode : Url.QS()['TMode'] || 'html',
// 显示模式
DMode : Url.QS()['DMode'] || Config.WYSIWYG,
AllowHTML : Url.QS()['AllowHTML'] != 'false' ? true : false,
AllowUBB : Url.QS()['AllowUBB'] != 'false' ? true : false,
// 引用外CSS
CSS : Url.QS()['CSS'] || '',
// 是否编辑框聚焦
Selectable : Url.QS()['Selectable'] != 'false' ? true : false,
// 标识第一次运行
FirstRun : false,
// 是否从其他模式切换到可视化
IsSwitch : false,
// 滚动条出现后,是否提示全屏
FullScreenPrompt : Url.QS()['FullScreenPrompt'] != 'false' ? true : false,
// 工具条,编辑区域
ToolBarName : 'ToolBar',
EditorAreaName : 'EditorArea',
StatusBarName : 'StatusBar',
// 父窗口的Editor类实例
Id : Url.QS()['Id'],
EditorObj : parent[Url.QS()['Id']],
// 当前编辑器对象,框架对象
Editor : null,
// EditType: XHTML|UBB|WYSIWYG
EditType : Config.WYSIWYG,
// 父窗口的文本域
TextField : null,
_TextField : null,
// 父窗口保存编辑状态隐藏域
EditorType : null,
// 主编辑器窗口对象iframe
EditorWindow : null,
// 编辑区域对象
EditorArea : null,
// 编辑框对象iframe
EditorIframe : null,
// 编辑框窗口对象
Window : null,
// 编辑框文档对象
Document : null,
// 存储源码文本域
TextArea : null,
// 原始内容类型
OriginType : '',
// 存储原始内容
OriginValue : '',
// 存储临时内容
TempValue : {first:'', second:'', type:''},
// 最小高度
MinHeight : 300,
// 高度叠加值
StepHeight : 100,
// 选择范围对象
SelectRange : null,
// 选择文本对象
TextRange : null,
TextRangeStart : 0,
TextRangeEnd : 0,
// 鼠标按下的当前对象
FocusHTMLElement : null,
//////
GetEditor : function () {
if (this.Editor) return this.Editor;
this.Editor = parent.$(this.FrameName);
return this.Editor;
},
// 编辑器宽度
Width : function () {
return this.GetEditor().offsetWidth;
},
// 编辑器高度
Height : function () {
return this.GetEditor().offsetHeight;
},
// 初始化
Initialize : function () {
var self = this;
// 工具栏
var tb = $(this.ToolBarName);
var sb = $(this.StatusBarName);
Toolbar.init(tb, sb);
// 本frame对象
this.EditorWindow = this.GetEditor();
//
Events.AttachEvent(document, 'keypress', function (e) {
var num;
if (e.keyCode == 13)
num = self.EditorObj && self.EditorObj.CloseWidget();
else
return;
if ($EO(e).tagName.toLowerCase() == 'textarea' && !e.ctrlKey) {
if (num) Events.CancelAll(e);
return;
}
if (!num) {
self.UpdateTextField();
if (self.EditorObj && self.EditorObj.Submit) {
self.EditorObj.Submitting(true);
self.EditorObj.Submit();
}
}
Events.CancelAll(e);
});
this.Resize();
},
// 开始编辑
StartEditor : function () {
var html = this._TextField.value;
// 显示模式为WYSIWYG或XHTML,文本模式为UBB
if ((this.DMode == Config.WYSIWYG || this.DMode == Config.XHTML) && this.TMode == Config.UBB) {
html = UBB.ubbToXhtml(html);
if (this.DMode == Config.XHTML)
html = UBB.imageHTMLUrlToSign(html);
else
html = UBB.imageHTMLSignToUrl(html);
this.OriginType = Config.XHTML;
}
// 显示模式为UBB,文本模式为HTML
else if (this.DMode == Config.UBB && this.TMode == Config.HTML) {
html = UBB.xhtmlToUbb(html);
this.OriginType = Config.UBB;
}
else {
this.OriginType = this.TMode == Config.HTML ? Config.XHTML : Config.UBB;
}
this.OriginValue = html;
this.TempValue = {first:html,second:html,type:this.OriginType};
this.DisplayTip();
html = html || (Browser.IsIE ? '' : '<br>');
this.CreateEditorArea(UBB.multimediaUbbToHtmlView(html));
},
// 编辑区
CreateEditorArea : function (html) {
if (! this.EditorArea) this.EditorArea = $('EditorArea');
while ( this.EditorArea.childNodes.length > 0 )
this.EditorArea.removeChild(this.EditorArea.childNodes[0]) ;
var oHtml =
['<html>',
'<head>',
(this.CSS ? '<link rel="stylesheet" type="text/css" href="' + this.CSS + '" />' : ''),
'<link rel="stylesheet" type="text/css" href="css/style.css" />',
'<script type="text/javascript">window.onload=function(){return true}</script>',
'</head>',
'<body class="maxcode-userenters">' + (Browser.IsIE ? (html || '') : (html || '<br>')) + '</body>',
'</html>'].join('');
var oIframe = this.EditorIframe = oNode.CreateIframe(this.Name);
oIframe.src = 'javascript:;';//'about:blank';
oIframe.frameBorder = 0;
oIframe.height = '100%';
oIframe.width = '100%';
this.EditorArea.appendChild(oIframe);
this.Window = oIframe.contentWindow;
var oDocument = this.Document = this.Window.document;
Events.AttachEvent(this.Window, 'error', function () {return true});
this.Window.onerror = function () {return true};
var SetEditor = function () {
// 无内容时,需放置一个空格,以防止编辑框无法获得焦点
oDocument.open();
oDocument.write(oHtml);
oDocument.close();
// 设置可编辑
if (Browser.IsIE) {
oDocument.body.contentEditable = true;
}
else {
oDocument.designMode = 'on';
}
// 设置Gecko不在<SPAN>标记使用bold, italic和underline样式
if (! Browser.IsIELike) {
try {
oDocument.execCommand('styleWithCSS', false, false);
oDocument.execCommand('useCSS', false, true);
//oDocument.execCommand('insertBrOnReturn', false, false);
}
catch (e) {}
}
// 设置选择区对象
cEditor.GetRange();
// 编辑器创建完成,或重新更新完毕
cEditor.CreateComplete();
};
// 设置可编辑
if (Browser.IsIE)
SetEditor();
else
setTimeout(SetEditor, 100);
},
// 存储区
CreateTextArea : function (text, type) {
var self = this;
if (! this.EditorArea) this.EditorArea = $('EditorArea');
this.EditorIframe = null;
while (this.EditorArea.childNodes.length > 0)
this.EditorArea.removeChild(this.EditorArea.childNodes[0]);
var TextArea = this.TextArea = document.createElement('textarea');
TextArea.style.border = '0';
TextArea.style.padding = '0';
TextArea.style.maring = '0';
TextArea.value = text;
// 失焦更新对应文本域
TextArea.onblur = function () {
self.UpdateTextField();
};
this.EditorArea.appendChild(TextArea);
},
TextAreaBindEvent : function () {
var self = this;
function gtr () {self.GetTextRange()}
var t = this.TextArea;
t.onkeyup = gtr;
t.onpaste = gtr;
t.onmouseup = gtr;
this.SelectOneTextArea();
},
// 编辑器创建完毕时调用
CreateComplete : function () {
var self = this;
// 编辑器绑定事件
if (Browser.IsIE) {
this.Document.onmouseup = function (e) {
self.GetRange();
Toolbar.responseIE(e);
};
if (!Browser.IsIE56) {
Events.AttachEvent(this.Document, 'keydown', function (e) {
self.GetRange();
Toolbar.responseIE(e, true);
}, false, this.Window);
}
this.Document.onkeyup = function (e) {
self.GetRange();
self.FocusHTMLElement = null;
};
//this.Document.onkeydown = function (e) {
// Toolbar.responseIE(e, true);
//};
}
else {
this.Document.addEventListener(
'mouseup',
function (e) {
self.GetRange();
Toolbar.responseGecko(e);
},
false
);
this.Document.addEventListener(
'keyup',
function (e) {
self.GetRange();
Toolbar.responseGecko(e, true);
self.FocusHTMLElement = null;
},
false
);
this.Document.addEventListener(
'dblclick',
function (e) {
self.GetRange();
Toolbar.responseGecko(e);
},
false
);
}
Events.AttachEvent(this.Document, 'mousedown', function (e) {
var obj = $EO(e);
self.FocusHTMLElement = obj;
//Toolbar.hideFace();
//Toolbar.clearFaces();
}, false, this.Window);
// resize editor
Events.AttachEvent(window, 'resize', function () {cEditor.Resize();});
// 编辑器内提交
var keyEvent = function (e) {
if (Browser.IsIE && e.keyCode == 8) {
var selection = self.Document.selection;
if (selection.type == 'Control') {
selection.clear();
self.GetRange();
Events.CancelAll(e);
return;
}
}
if (e.keyCode == 13) {
var num = self.EditorObj && self.EditorObj.CloseWidget();
if (Browser.IsIE && !e.ctrlKey && !e.altKey && !e.shiftKey && num == 0) {
self.GetRange();
Events.CancelAll(e);
self.InsertContent('<br>');
return;
}
try {
if (e.ctrlKey && !num) {
if (self.EditorObj && self.EditorObj.Submit) {
//self.UpdateTextField();
self.EditorObj.Submitting(true);
self.EditorObj.Submit();
};
}
num && Events.CancelAll(e);
}
catch (e) {}
}
// F5
if (e.keyCode == 116) self.UpdateTextField();
}
if (Browser.IsOpera) Events.AttachEvent(this.Document, 'keypress', keyEvent, false, this.Window);
else Events.AttachEvent(this.Document, 'keydown', keyEvent, false, this.Window);
// 失焦后更新相应文本域
//Events.AttachEvent(Browser.IsIE ? this.Document.body : this.Window, 'blur', function () {
// if (!self.isWYSIWYG()) return;
// self.UpdateTextField();
//});
// 屏蔽脚本错误,由拷贝网页内容导致的问题
this.Window.onerror = function () {return true};
Events.AttachEvent(this.Window, 'error', function (e) {
Events.CancelAll(e);
}, this.Window);
// clear space
if (Browser.IsIE) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -