| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841 |
- (function ($) {
- var ie = $.browser.msie,
- iOS = /iphone|ipad|ipod/i.test(navigator.userAgent);
- $.TE = {
- version:'1.0', // 版本号
- debug: 1, //调试开关
- timeOut: 3000, //加载单个文件超时时间,单位为毫秒。
- defaults: {
- //默认参数controls,noRigths,plugins,定义加载插件
- controls: "source,|,undo,redo,|,cut,copy,paste,pastetext,selectAll,blockquote,|,image,flash,table,hr,pagebreak,face,code,|,link,unlink,|,print,fullscreen,|,eq,|,style,font,fontsize,|,fontcolor,backcolor,|,bold,italic,underline,strikethrough,unformat,|,leftalign,centeralign,rightalign,blockjustify,|,orderedlist,unorderedlist,indent,outdent,|,subscript,superscript",
- //noRights:"underline,strikethrough,superscript",
- width: 740,
- height: 500,
- skins: "default",
- resizeType: 2,
- face_path: ['qq_face', 'qq_face'],
- minHeight: 200,
- minWidth: 500,
- uploadURL: 'about:blank',
- theme: 'default'
- },
- buttons: {
- //按钮属性
- //eq: {title: '等于',cmd: 'bold'},
- bold: { title: "加粗", cmd: "bold" },
- pastetext: { title: "粘贴无格式", cmd: "bold" },
- pastefromword: { title: "粘贴word格式", cmd: "bold" },
- selectAll: { title: "全选", cmd: "selectall" },
- blockquote: { title: "引用" },
- find: { title: "查找", cmd: "bold" },
- flash: { title: "插入flash", cmd: "bold" },
- media: { title: "插入多媒体", cmd: "bold" },
- table: { title: "插入表格" },
- pagebreak: { title: "插入分页符" },
- face: { title: "插入表情", cmd: "bold" },
- code: { title: "插入源码", cmd: "bold" },
- print: { title: "打印", cmd: "print" },
- about: { title: "关于", cmd: "bold" },
- fullscreen: { title: "全屏", cmd: "fullscreen" },
- source: { title: "HTML代码", cmd: "source" },
- undo: { title: "后退", cmd: "undo" },
- redo: { title: "前进", cmd: "redo" },
- cut: { title: "剪贴", cmd: "cut" },
- copy: { title: "复制", cmd: "copy" },
- paste: { title: "粘贴", cmd: "paste" },
- hr: { title: "插入横线", cmd: "inserthorizontalrule" },
- link: { title: "创建链接", cmd: "createlink" },
- unlink: { title: "删除链接", cmd: "unlink" },
- italic: { title: "斜体", cmd: "italic" },
- underline: { title: "下划线", cmd: "underline" },
- strikethrough: { title: "删除线", cmd: "strikethrough" },
- unformat: { title: "清除格式", cmd: "removeformat" },
- subscript: { title: "下标", cmd: "subscript" },
- superscript: { title: "上标", cmd: "superscript" },
- orderedlist: { title: "有序列表", cmd: "insertorderedlist" },
- unorderedlist: { title: "无序列表", cmd: "insertunorderedlist" },
- indent: { title: "增加缩进", cmd: "indent" },
- outdent: { title: "减少缩进", cmd: "outdent" },
- leftalign: { title: "左对齐", cmd: "justifyleft" },
- centeralign: { title: "居中对齐", cmd: "justifycenter" },
- rightalign: { title: "右对齐", cmd: "justifyright" },
- blockjustify: { title: "两端对齐", cmd: "justifyfull" },
- font: { title: "字体", cmd: "fontname", value: "微软雅黑" },
- fontsize: { title: "字号", cmd: "fontsize", value: "4" },
- style: { title: "段落标题", cmd: "formatblock", value: "" },
- fontcolor: { title: "前景颜色", cmd: "forecolor", value: "#ff6600" },
- backcolor: { title: "背景颜色", cmd: "hilitecolor", value: "#ff6600" },
- image: { title: "插入图片", cmd: "insertimage", value: "" }
- },
- defaultEvent: {
- event: "click mouseover mouseout",
- click: function (e) {
- this.exec(e);
- },
- mouseover: function (e) {
- var opt = this.editor.opt;
- this.$btn.addClass(opt.cssname.mouseover);
- },
- mouseout: function (e) { },
- noRight: function (e) { },
- init: function (e) { },
- exec: function () {
- this.editor.restoreRange();
- //执行命令
- if ($.isFunction(this[this.cmd])) {
- this[this.cmd](); //如果有已当前cmd为名的方法,则执行
- } else {
- this.editor.doc.execCommand(this.cmd, 0, this.value || null);
- }
- this.editor.focus();
- this.editor.refreshBtn();
- this.editor.hideDialog();
- },
- createDialog: function (v) {
- //创建对话框
- var editor = this.editor,
- opt = editor.opt,
- $btn = this.$btn,
- _self = this;
- var defaults = {
- body: "", //对话框内容
- closeBtn: opt.cssname.dialogCloseBtn,
- okBtn: opt.cssname.dialogOkBtn,
- ok: function () {
- //点击ok按钮后执行函数
- },
- setDialog: function ($dialog) {
- //设置对话框(位置)
- var y = $btn.offset().top + $btn.outerHeight();
- var x = $btn.offset().left;
- $dialog.offset({
- top: y,
- left: x
- });
- }
- };
- var options = $.extend(defaults, v);
- //初始化对话框
- editor.$dialog.empty();
- //加入内容
- $body = $.type(options.body) == "string" ? $(options.body) : options.body;
- $dialog = $body.appendTo(editor.$dialog);
- $dialog.find("." + options.closeBtn).click(function () { _self.hideDialog(); });
- $dialog.find("." + options.okBtn).click(options.ok);
- //设置对话框
- editor.$dialog.show();
- options.setDialog(editor.$dialog);
- },
- hideDialog: function () {
- this.editor.hideDialog();
- }
- //getEnable:function(){return false},
- //disable:function(e){alert('disable')}
- },
- plugin: function (name, v) {
- //新增或修改插件。
- $.TE.buttons[name] = $.extend($.TE.buttons[name], v);
- },
- config: function (name, value) {
- var _fn = arguments.callee;
- if (!_fn.conf) _fn.conf = {};
- if (value) {
- _fn.conf[name] = value;
- return true;
- } else {
- return name == 'default' ? $.TE.defaults : _fn.conf[name];
- }
- },
- systemPlugins: ['system', 'upload_interface'], //系统自带插件
- basePath: function () {
- var jsFile = "ThinkEditor.js";
- var src = $("script[src$='" + jsFile + "']").attr("src");
- return src.substr(0, src.length - jsFile.length);
- }
- };
- $.fn.extend({
- //调用插件
- ThinkEditor: function (v) {
- //配置处理
- var conf = '',
- temp = '';
- conf = v ? $.extend($.TE.config(v.theme ? v.theme : 'default'), v) : $.TE.config('default');
- v = conf;
- //配置处理完成
- //载入皮肤
- var skins = v.skins || $.TE.defaults.skins; //获得皮肤参数
- var skinsDir = $.TE.basePath() + "skins/" + skins + "/",
- jsFile = "@" + skinsDir + "config.js",
- cssFile = "@" + skinsDir + "style.css";
- var _self = this;
- //加载插件
- if ($.defined(v.plugins)) {
- var myPlugins = $.type(v.plugins) == "string" ? [v.plugins] : v.plugins;
- var files = $.merge($.merge([], $.TE.systemPlugins), myPlugins);
- } else {
- var files = $.TE.systemPlugins;
- }
- $.each(files, function (i, v) {
- files[i] = v + ".js";
- })
- files.push(jsFile, cssFile);
- files.push("@" + skinsDir + "dialog/css/base.css");
- files.push("@" + skinsDir + "dialog/css/te_dialog.css");
- $.loadFile(files, function () {
- //设置css参数
- v.cssname = $.extend({}, TECSS, v.cssname);
- //创建编辑器,存储对象
- $(_self).each(function (idx, elem) {
- var data = $(elem).data("editorData");
- if (!data) {
- data = new ThinkEditor(elem, v);
- $(elem).data("editorData", data);
- }
- });
- });
- }
- });
- //编辑器对象。
- function ThinkEditor(area, v) {
- //添加随机序列数防冲突
- var _fn = arguments.callee;
- this.guid = !_fn.guid ? _fn.guid = 1 : _fn.guid += 1;
- //生成参数
- var opt = this.opt = $.extend({}, $.TE.defaults, v);
- var _self = this;
- //结构:主层,工具层,分组层,按钮层,底部,dialog层
- var $main = this.$main = $("<div></div>").addClass(opt.cssname.main),
- $toolbar_box = $('<div></div>').addClass(opt.cssname.toolbar_box).appendTo($main),
- $toolbar = this.$toolbar = $("<div></div>").addClass(opt.cssname.toolbar).appendTo($toolbar_box),
- /*$toolbar=this.$toolbar=$("<div></div>").addClass(opt.cssname.toolbar).appendTo($main),*/
- $group = $("<div></div>").addClass(opt.cssname.group).appendTo($toolbar),
- $bottom = this.$bottom = $("<div></div>").addClass(opt.cssname.bottom),
- $dialog = this.$dialog = $("<div></div>").addClass(opt.cssname.dialog),
- $area = $(area).hide(),
- $frame = $('<iframe frameborder="0"></iframe>');
- opt.noRights = opt.noRights || "";
- var noRights = opt.noRights.split(",");
- //调整结构
- $main.insertBefore($area)
- .append($area);
- //加入frame
- $frame.appendTo($main);
- //加入bottom
- if (opt.resizeType != 0) {
- //拖动改变编辑器高度
- $("<div></div>").addClass(opt.cssname.resizeCenter).mousedown(function (e) {
- var y = e.pageY,
- x = e.pageX,
- height = _self.$main.height(),
- width = _self.$main.width();
- $(document).add(_self.doc).mousemove(function (e) {
- var mh = e.pageY - y;
- _self.resize(width, height + mh);
- });
- $(document).add(_self.doc).mouseup(function (e) {
- $(document).add(_self.doc).unbind("mousemove");
- $(document).add(_self.doc).unbind("mousemup");
- });
- }).appendTo($bottom);
- }
- if (opt.resizeType == 2) {
- //拖动改变编辑器高度和宽度
- $("<div></div>").addClass(opt.cssname.resizeLeft).mousedown(function (e) {
- var y = e.pageY,
- x = e.pageX,
- height = _self.$main.height(),
- width = _self.$main.width();
- $(document).add(_self.doc).mousemove(function (e) {
- var mh = e.pageY - y,
- mw = e.pageX - x;
- _self.resize(width + mw, height + mh);
- });
- $(document).add(_self.doc).mouseup(function (e) {
- $(document).add(_self.doc).unbind("mousemove");
- $(document).add(_self.doc).unbind("mousemup");
- });
- }).appendTo($bottom);
- }
- $bottom.appendTo($main);
- $dialog.appendTo($main);
- //循环按钮处理。
- //TODO 默认参数处理
- $.each(opt.controls.split(","), function (idx, bname) {
- var _fn = arguments.callee;
- if (_fn.count == undefined) {
- _fn.count = 0;
- }
- //处理分组
- if (bname == "|") {
- //设定分组宽
- if (_fn.count) {
- $toolbar.find('.' + opt.cssname.group + ':last').css('width', (opt.cssname.btnWidth * _fn.count + opt.cssname.lineWidth) + 'px');
- _fn.count = 0;
- }
- //分组宽结束
- $group = $("<div></div>").addClass(opt.cssname.group).appendTo($toolbar);
- $("<div> </div>").addClass(opt.cssname.line).appendTo($group);
- } else {
- //更新统计数
- _fn.count += 1;
- //获取按钮属性
- var btn = $.extend({}, $.TE.defaultEvent, $.TE.buttons[bname]);
- //标记无权限
- var noRightCss = "", noRightTitle = "";
- if ($.inArray(bname, noRights) != -1) {
- noRightCss = " " + opt.cssname.noRight;
- noRightTitle = "(无权限)";
- }
- $btn = $("<div></div>").addClass(opt.cssname.btn + " " + opt.cssname.btnpre + bname + noRightCss)
- .data("bname", bname)
- .attr("title", btn.title + noRightTitle)
- .appendTo($group)
- .bind(btn.event, function (e) {
- //不可用触发
- if ($(this).is("." + opt.cssname.disable)) {
- if ($.isFunction(btn.disable)) btn.disable.call(btn, e);
- return false;
- }
- //判断权限和是否可用
- if ($(this).is("." + opt.cssname.noRight)) {
- //点击时触发无权限说明
- btn['noRight'].call(btn, e);
- return false;
- }
- if ($.isFunction(btn[e.type])) {
- //触发事件
- btn[e.type].call(btn, e);
- //TODO 刷新按钮
- }
- });
- if ($.isFunction(btn.init)) btn.init.call(btn); //初始化
- if (ie) $btn.attr("unselectable", "on");
- btn.editor = _self;
- btn.$btn = $btn;
- }
- });
- //调用核心
- this.core = new editorCore($frame, $area);
- this.doc = this.core.doc;
- this.$frame = this.core.$frame;
- this.$area = this.core.$area;
- this.restoreRange = this.core.restoreRange;
- this.selectedHTML = function () { return this.core.selectedHTML(); }
- this.selectedText = function () { return this.core.selectedText(); }
- this.pasteHTML = function (v) { this.core.pasteHTML(v); }
- this.sourceMode = this.core.sourceMode;
- this.focus = this.core.focus;
- //监控变化
- $(this.core.doc).click(function () {
- //隐藏对话框
- _self.hideDialog();
- }).bind("keyup mouseup", function () {
- _self.refreshBtn();
- })
- this.refreshBtn();
- //调整大小
- this.resize(opt.width, opt.height);
- //获取DOM层级
- this.core.focus();
- }
- //end ThinkEditor
- ThinkEditor.prototype.resize = function (w, h) {
- //最小高度和宽度
- var opt = this.opt,
- h = h < opt.minHeight ? opt.minHeight : h,
- w = w < opt.minWidth ? opt.minWidth : w;
- this.$main.width(w).height(h);
- var height = h - (this.$toolbar.parent().outerHeight() + this.$bottom.height());
- this.$frame.height(height).width("100%");
- this.$area.height(height).width("100%");
- };
- //隐藏对话框
- ThinkEditor.prototype.hideDialog = function () {
- var opt = this.opt;
- $("." + opt.cssname.dialog).hide();
- };
- //刷新按钮
- ThinkEditor.prototype.refreshBtn = function () {
- var sourceMode = this.sourceMode(); // 标记状态。
- var opt = this.opt;
- if (!iOS && $.browser.webkit && !this.focused) {
- this.$frame[0].contentWindow.focus();
- window.focus();
- this.focused = true;
- }
- var queryObj = this.doc;
- if (ie) queryObj = this.core.getRange();
- //循环按钮
- //TODO undo,redo等判断
- this.$toolbar.find("." + opt.cssname.btn + ":not(." + opt.cssname.noRight + ")").each(function () {
- var enabled = true,
- btnName = $(this).data("bname"),
- btn = $.extend({}, $.TE.defaultEvent, $.TE.buttons[btnName]),
- command = btn.cmd;
- if (sourceMode && btnName != "source") {
- enabled = false;
- } else if ($.isFunction(btn.getEnable)) {
- enabled = btn.getEnable.call(btn);
- } else if ($.isFunction(btn[command])) {
- enabled = true; //如果命令为自定义命令,默认为可用
- } else {
- if (!ie || btn.cmd != "inserthtml") {
- try {
- enabled = queryObj.queryCommandEnabled(command);
- $.debug(enabled.toString(), "命令:" + command);
- }
- catch (err) {
- enabled = false;
- }
- }
- //判断该功能是否有实现 @TODO 代码胶着
- if ($.TE.buttons[btnName]) enabled = true;
- }
- if (enabled) {
- $(this).removeClass(opt.cssname.disable);
- } else {
- $(this).addClass(opt.cssname.disable);
- }
- });
- };
- //core code start
- function editorCore($frame, $area, v) {
- //TODO 参数改为全局的。
- var defaults = {
- docType: '<!DOCTYPE HTML>',
- docCss: "",
- bodyStyle: "margin:4px; font:10pt Arial,Verdana; cursor:text",
- focusExt: function (editor) {
- //触发编辑器获得焦点时执行,比如刷新按钮
- },
- //textarea内容更新到iframe的处理函数
- updateFrame: function (code) {
- //翻转flash为占位符
- code = code.replace(/(<embed[^>]*?type="application\/x-shockwave-flash" [^>]*?>)/ig, function ($1) {
- var ret = '<img class="_flash_position" src="' + $.TE.basePath() + 'skins/default/img/spacer.gif" style="',
- _width = $1.match(/width="(\d+)"/),
- _height = $1.match(/height="(\d+)"/),
- _src = $1.match(/src="([^"]+)"/),
- _wmode = $1.match(/wmode="(\w+)"/),
- _data = '';
- _width = _width && _width[1] ? parseInt(_width[1]) : 0;
- _height = _height && _height[1] ? parseInt(_height[1]) : 0;
- _src = _src && _src[1] ? _src[1] : '';
- _wmode = _wmode && _wmode[1] ? true : false;
- _data = "{'src':'" + _src + "','width':'" + _width + "','height':'" + _height + "','wmode':" + (_wmode) + "}";
- if (_width) ret += 'width:' + _width + 'px;';
- if (_height) ret += 'height:' + _height + 'px;';
- ret += 'border:1px solid #DDD; display:inline-block;text-align:center;line-height:' + _height + 'px;" ';
- ret += '_data="' + _data + '"';
- ret += ' alt="flash占位符" />';
- return ret;
- });
- return code;
- },
- //iframe更新到text的, TODO 去掉
- updateTextArea: function (html) {
- //翻转占位符为flash
- html = html.replace(/(<img[^>]*?class=(?:"|)_flash_position(?:"|)[^>]*?>)/ig, function ($1) {
- var ret = '',
- data = $1.match(/_data="([^"]*)"/);
- if (data && data[1]) {
- data = eval('(' + data + ')');
- }
- ret += '<embed type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" ';
- ret += 'src="' + data.src + '" ';
- ret += 'width="' + data.width + '" ';
- ret += 'height="' + data.height + '" ';
- if (data.wmode) ret += 'wmode="transparent" ';
- ret += '/>';
- return ret;
- });
- return html;
- }
- };
- options = $.extend({}, defaults, v);
- //存储属性
- this.opt = options;
- this.$frame = $frame;
- this.$area = $area;
- var contentWindow = $frame[0].contentWindow,
- doc = this.doc = contentWindow.document,
- $doc = $(doc);
- var _self = this;
- //初始化
- doc.open();
- doc.write(
- options.docType +
- '<html>' +
- ((options.docCss === '') ? '' : '<head><link rel="stylesheet" type="text/css" href="' + options.docCss + '" /></head>') +
- '<body style="' + options.bodyStyle + '"></body></html>'
- );
- doc.close();
- //设置frame编辑模式
- try {
- if (ie) {
- doc.body.contentEditable = true;
- }
- else {
- doc.designMode = "on";
- }
- } catch (err) {
- $.debug(err, "创建编辑模式错误");
- }
- //统一 IE FF 等的 execCommand 行为
- try {
- this.e.execCommand("styleWithCSS", 0, 0)
- }
- catch (e) {
- try {
- this.e.execCommand("useCSS", 0, 1);
- } catch (e) { }
- }
- //监听
- if (ie)
- $doc.click(function () {
- _self.focus();
- });
- this.updateFrame(); //更新内容
- if (ie) {
- $doc.bind("beforedeactivate beforeactivate selectionchange keypress", function (e) {
- if (e.type == "beforedeactivate")
- _self.inactive = true;
- else if (e.type == "beforeactivate") {
- if (!_self.inactive && _self.range && _self.range.length > 1)
- _self.range.shift();
- delete _self.inactive;
- }
- else if (!_self.inactive) {
- if (!_self.range)
- _self.range = [];
- _self.range.unshift(_self.getRange());
- while (_self.range.length > 2)
- _self.range.pop();
- }
- });
- // Restore the text range when the iframe gains focus
- $frame.focus(function () {
- _self.restoreRange();
- });
- }
- ($.browser.mozilla ? $doc : $(contentWindow)).blur(function () {
- _self.updateTextArea(true);
- });
- this.$area.blur(function () {
- // Update the iframe when the textarea loses focus
- _self.updateFrame(true);
- });
- /*
- * //自动添加p标签
- * $doc.keydown(function(e){
- * if(e.keyCode == 13){
- * //_self.pasteHTML('<p> </p>');
- * //this.execCommand( 'formatblock', false, '<p>' );
- * }
- * });
- */
- }
- //是否为源码模式
- editorCore.prototype.sourceMode = function () {
- return this.$area.is(":visible");
- };
- //编辑器获得焦点
- editorCore.prototype.focus = function () {
- var opt = this.opt;
- if (this.sourceMode()) {
- this.$area.focus();
- }
- else {
- this.$frame[0].contentWindow.focus();
- }
- if ($.isFunction(opt.focusExt)) opt.focusExt(this);
- };
- //textarea内容更新到iframe
- editorCore.prototype.updateFrame = function (checkForChange) {
- var code = this.$area.val(),
- options = this.opt,
- updateFrameCallback = options.updateFrame,
- $body = $(this.doc.body);
- //判断是否已经修改
- if (updateFrameCallback) {
- var sum = checksum(code);
- if (checkForChange && this.areaChecksum == sum)
- return;
- this.areaChecksum = sum;
- }
- //回调函数处理
- var html = updateFrameCallback ? updateFrameCallback(code) : code;
- // 禁止script标签
- html = html.replace(/<(?=\/?script)/ig, "<");
- // TODO,判断是否有作用
- if (options.updateTextArea)
- this.frameChecksum = checksum(html);
- if (html != $body.html()) {
- $body.html(html);
- }
- };
- editorCore.prototype.getRange = function () {
- if (ie) return this.getSelection().createRange();
- return this.getSelection().getRangeAt(0);
- };
- editorCore.prototype.getSelection = function () {
- if (ie) return this.doc.selection;
- return this.$frame[0].contentWindow.getSelection();
- };
- editorCore.prototype.restoreRange = function () {
- if (ie && this.range)
- this.range[0].select();
- };
- editorCore.prototype.selectedHTML = function () {
- this.restoreRange();
- var range = this.getRange();
- if (ie)
- return range.htmlText;
- var layer = $("<layer>")[0];
- layer.appendChild(range.cloneContents());
- var html = layer.innerHTML;
- layer = null;
- return html;
- };
- editorCore.prototype.selectedText = function () {
- this.restoreRange();
- if (ie) return this.getRange().text;
- return this.getSelection().toString();
- };
- editorCore.prototype.pasteHTML = function (value) {
- this.restoreRange();
- if (ie) {
- this.getRange().pasteHTML(value);
- } else {
- this.doc.execCommand("inserthtml", 0, value || null);
- }
- //获得焦点
- this.$frame[0].contentWindow.focus();
- }
- editorCore.prototype.updateTextArea = function (checkForChange) {
- var html = $(this.doc.body).html(),
- options = this.opt,
- updateTextAreaCallback = options.updateTextArea,
- $area = this.$area;
- if (updateTextAreaCallback) {
- var sum = checksum(html);
- if (checkForChange && this.frameChecksum == sum)
- return;
- this.frameChecksum = sum;
- }
- var code = updateTextAreaCallback ? updateTextAreaCallback(html) : html;
- // TODO 判断是否有必要
- if (options.updateFrame)
- this.areaChecksum = checksum(code);
- if (code != $area.val()) {
- $area.val(code);
- }
- };
- function checksum(text) {
- var a = 1, b = 0;
- for (var index = 0; index < text.length; ++index) {
- a = (a + text.charCodeAt(index)) % 65521;
- b = (b + a) % 65521;
- }
- return (b << 16) | a;
- }
- $.extend({
- teExt: {
- //扩展配置
- },
- debug: function (msg, group) {
- //判断是否有console对象
- if ($.TE.debug && window.console !== undefined) {
- //分组开始
- if (group) console.group(group);
- if ($.type(msg) == "string") {
- //是否为执行特殊函数,用双冒号隔开
- if (msg.indexOf("::") != -1) {
- var arr = msg.split("::");
- eval("console." + arr[0] + "('" + arr[1] + "')");
- } else {
- console.debug(msg);
- }
- } else {
- if ($(msg).html() == null) {
- console.dir(msg); //输出对象或数组
- } else {
- console.dirxml($(msg)[0]); //输出dom对象
- }
- }
- //记录trace信息
- if ($.TE.debug == 2) {
- console.group("trace 信息:");
- console.trace();
- console.groupEnd();
- }
- //分组结束
- if (group) console.groupEnd();
- }
- },
- //end debug
- defined: function (variable) {
- return $.type(variable) == "undefined" ? false : true;
- },
- isTag: function (tn) {
- if (!tn) return false;
- return $(this)[0].tagName.toLowerCase() == tn ? true : false;
- },
- //end istag
- include: function (file) {
- if (!$.defined($.TE.loadUrl)) $.TE.loadUrl = {};
- //定义皮肤路径和插件路径。
- var basePath = $.TE.basePath(),
- skinsDir = basePath + "skins/",
- pluginDir = basePath + "plugins/";
- var files = $.type(file) == "string" ? [file] : file;
- for (var i = 0; i < files.length; i++) {
- var loadurl = name = $.trim(files[i]);
- //判断是否已经加载过
- if ($.TE.loadUrl[loadurl]) {
- continue;
- }
- //判断是否有@
- var at = false;
- if (name.indexOf("@") != -1) {
- at = true;
- name = name.substr(1);
- }
- var att = name.split('.');
- var ext = att[att.length - 1].toLowerCase();
- if (ext == "css") {
- //加载css
- var filepath = at ? name : skinsDir + name;
- var newNode = document.createElement("link");
- newNode.setAttribute('type', 'text/css');
- newNode.setAttribute('rel', 'stylesheet');
- newNode.setAttribute('href', filepath);
- $.TE.loadUrl[loadurl] = 1;
- } else {
- var filepath = at ? name : pluginDir + name;
- //$("<scri"+"pt>"+"</scr"+"ipt>").attr({src:filepath,type:'text/javascript'}).appendTo('head');
- var newNode = document.createElement("script");
- newNode.type = "text/javascript";
- newNode.src = filepath;
- newNode.id = loadurl; //实现批量加载
- newNode.onload = function () {
- $.TE.loadUrl[this.id] = 1;
- };
- newNode.onreadystatechange = function () {
- //针对ie
- if ((newNode.readyState == 'loaded' || newNode.readyState == 'complete')) {
- $.TE.loadUrl[this.id] = 1;
- }
- };
- }
- $("head")[0].appendChild(newNode);
- }
- },
- //end include
- loadedFile: function (file) {
- //判断是否加载
- if (!$.defined($.TE.loadUrl)) return false;
- var files = $.type(file) == "string" ? [file] : file,
- result = true;
- $.each(files, function (i, name) {
- if (!$.TE.loadUrl[name]) result = false;
- //alert(name+':'+result);
- });
-
- return result;
- },
- //end loaded
- loadFile: function (file, fun) {
- //加载文件,加载完毕后执行fun函数。
- $.include(file);
-
- var time = 0;
- var check = function () {
- //alert($.loadedFile(file));
- if ($.loadedFile(file)) {
- if ($.isFunction(fun)) fun();
- } else {
- //alert(time);
- if (time >= $.TE.timeOut) {
- // TODO 细化哪些文件加载失败。
- $.debug(file, "文件加载失败");
- } else {
- //alert('time:'+time);
- setTimeout(check, 50);
- time += 50;
- }
- }
- };
- check();
- }
- //end loadFile
- });
- })(jQuery);
- jQuery.TE.config( 'mini', {
- 'controls' : 'font,fontsize,fontcolor,backcolor,bold,italic,underline,unformat,leftalign,centeralign,rightalign,orderedlist,unorderedlist',
- 'width':498,
- 'height':400,
- 'resizeType':1
- } );
|