?? coreeditor.js
字號(hào):
?/*
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 = {
// 名稱,用于引用父窗口的文本域,標(biāo)記唯一性
Name : Url.QS()['Name'],
// 當(dāng)前窗口所在父窗口中的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,
// 標(biāo)識(shí)第一次運(yùn)行
FirstRun : false,
// 是否從其他模式切換到可視化
IsSwitch : false,
// 滾動(dòng)條出現(xiàn)后,是否提示全屏
FullScreenPrompt : Url.QS()['FullScreenPrompt'] != 'false' ? true : false,
// 工具條,編輯區(qū)域
ToolBarName : 'ToolBar',
EditorAreaName : 'EditorArea',
StatusBarName : 'StatusBar',
// 父窗口的Editor類實(shí)例
Id : Url.QS()['Id'],
EditorObj : parent[Url.QS()['Id']],
// 當(dāng)前編輯器對(duì)象,框架對(duì)象
Editor : null,
// EditType: XHTML|UBB|WYSIWYG
EditType : Config.WYSIWYG,
// 父窗口的文本域
TextField : null,
_TextField : null,
// 父窗口保存編輯狀態(tài)隱藏域
EditorType : null,
// 主編輯器窗口對(duì)象iframe
EditorWindow : null,
// 編輯區(qū)域?qū)ο? EditorArea : null,
// 編輯框?qū)ο骾frame
EditorIframe : null,
// 編輯框窗口對(duì)象
Window : null,
// 編輯框文檔對(duì)象
Document : null,
// 存儲(chǔ)源碼文本域
TextArea : null,
// 原始內(nèi)容類型
OriginType : '',
// 存儲(chǔ)原始內(nèi)容
OriginValue : '',
// 存儲(chǔ)臨時(shí)內(nèi)容
TempValue : {first:'', second:'', type:''},
// 最小高度
MinHeight : 300,
// 高度疊加值
StepHeight : 100,
// 選擇范圍對(duì)象
SelectRange : null,
// 選擇文本對(duì)象
TextRange : null,
TextRangeStart : 0,
TextRangeEnd : 0,
// 鼠標(biāo)按下的當(dāng)前對(duì)象
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對(duì)象
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();
},
// 開(kāi)始編輯
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));
},
// 編輯區(qū)
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 () {
// 無(wú)內(nèi)容時(shí),需放置一個(gè)空格,以防止編輯框無(wú)法獲得焦點(diǎn)
oDocument.open();
oDocument.write(oHtml);
oDocument.close();
// 設(shè)置可編輯
if (Browser.IsIE) {
oDocument.body.contentEditable = true;
}
else {
oDocument.designMode = 'on';
}
// 設(shè)置Gecko不在<SPAN>標(biāo)記使用bold, italic和underline樣式
if (! Browser.IsIELike) {
try {
oDocument.execCommand('styleWithCSS', false, false);
oDocument.execCommand('useCSS', false, true);
//oDocument.execCommand('insertBrOnReturn', false, false);
}
catch (e) {}
}
// 設(shè)置選擇區(qū)對(duì)象
cEditor.GetRange();
// 編輯器創(chuàng)建完成,或重新更新完畢
cEditor.CreateComplete();
};
// 設(shè)置可編輯
if (Browser.IsIE)
SetEditor();
else
setTimeout(SetEditor, 100);
},
// 存儲(chǔ)區(qū)
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;
// 失焦更新對(duì)應(yīng)文本域
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();
},
// 編輯器創(chuàng)建完畢時(shí)調(diào)用
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();});
// 編輯器內(nèi)提交
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);
// 失焦后更新相應(yīng)文本域
//Events.AttachEvent(Browser.IsIE ? this.Document.body : this.Window, 'blur', function () {
// if (!self.isWYSIWYG()) return;
// self.UpdateTextField();
//});
// 屏蔽腳本錯(cuò)誤,由拷貝網(wǎng)頁(yè)內(nèi)容導(dǎo)致的問(wèn)題
this.Window.onerror = function () {return true};
Events.AttachEvent(this.Window, 'error', function (e) {
Events.CancelAll(e);
}, this.Window);
// clear space
if (Browser.IsIE) {
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -