@qingjieshouliang
Current Path : /www/wwwroot/eblliwsm.com/c7bd1a80/Extend/Tool/thinkeditor/ |
Current File : /www/wwwroot/eblliwsm.com/c7bd1a80/Extend/Tool/thinkeditor/ThinkEditor.js |
(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 } );