⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 coreeditor.js

📁 asp的bbs程序
💻 JS
📖 第 1 页 / 共 3 页
字号:
/*
  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 + -