jquery-自己写的editor编辑器仅供参考

sEditorConfig = {
	selector: "textarea",
	uploadJson: "/upload/submit"
};

sDialog = {};
sDialog.beforeCreate = function(id) {return id;};
sDialog.endCreate = function(ev) {};
sDialog.create = function(options) {
	var self = $('#'+options.id);
	if (self.size() > 0) {
		self.trigger('open'); return self;
	}
	
	self = $('<div>').addClass('sdialog sdialog-window').append([
		'<div class="sdialog-header">'+ options.title +'<span class="sdialog-icon-close" title="关闭"></span></div>',
		'<div class="sdialog-body"></div>',
		'<div class="sdialog-footer"><input type="button" value="确定" class="sdialog-button sdialog-button-yes" /> <input type="button" value="取消" class="sdialog-button sdialog-button-no" /></div>'
	].join(''));
	
	if (options.id) {self.attr('id', options.id);}
	if (options.width) {self.css('width', options.width);}
	if (options.height) {self.css('height', options.height);}
	
	self.appendTo(document.body);
	$('.sdialog-body', self).html(options.html);
	
	$('.sdialog-icon-close', self).bind('click', function() {
		self.remove();
	});
	
	if (typeof options.init == 'function') {
		options.init.call(this, self);
	}
	
	$('.sdialog-button-yes', self).bind('click', function() {
		options.callback.call(this, self);
		self.trigger('close');
	});
	
	$('.sdialog-button-no', self).bind('click', function() {
		self.trigger('close');
	});
	
	self.bind('open', function() {
		sDialog.closeAll(this);
		var w = $(this).outerWidth();
		var h = $(this).outerHeight();
		var x = $(document).scrollLeft() + ($(window).width() - w) / 2;
		var y = $(document).scrollTop() + ($(window).height() - h) / 2;
		$(this).css({"left" : x, "top" : y}).draggable({handle: '.sdialog-header'}).show();
	});
	self.bind('close', function() {
		$(this).hide();
	});
	self.trigger('open');
	return self;
};

sDialog.beforePopup = function(id) {return id;};
sDialog.endPopup = function(ev) {};
sDialog.popup = function(options) {
	var self = $('#'+options.id);
	if (self.size() > 0) {
		self.trigger('open'); return self;
	}
	
	self = $('<div>').addClass('sdialog').append([
		'<div class="sdialog-popup">',
		'<div class="caret"></div>',
		'</div>'
	].join(''));
	
	if (options.id) {self.attr('id', options.id);}
	if (options.width) {self.css('width', options.width);}
	if (options.height) {self.css('height', options.height);}
	
	self.appendTo(document.body);
	$('.sdialog-popup', self).append(options.html);
	
	var dom = options.ev;
	var p = dom.parent();	
	
	if (typeof options.init == 'function') {
		options.init.call(this, self);
	}
	
	self.bind('open', function() {
		sDialog.closeAll(this);
		var position = {
			"top": p.offset().top + p.outerHeight(),
			"left": dom.offset().left
		};
		$(this).css(position).show(); 
		$('.sdialog-popup .caret', this).css("left", dom.outerWidth() / 2);
	});
	
	self.bind('close', function() {
		$(this).hide();
	});
	
	self.trigger('open');
	return self;
};

sDialog.closeAll = function(filter) {
	$('.sdialog').not(filter).trigger('close');
};

sDialog.showMsg = function(msg) {
	alert(msg);
}

sUbb = {};
sUbb.compile = {};
sUbb.compile.img = function(url) {return '[img]'+ url +'[/img]';}
sUbb.compile.video = function(url) {return '[video]'+ url +'[/video]';}
sUbb.compile.emoticon = function(k) {return '[emoticon='+ k +' /]';}
sUbb.compile.audio  = function(url) {return '[audio]'+ url +'[/audio]';}
sUbb.compile.file  = function(url) {return '[file]'+ url +'[/file]';}

$(document).ready(function() {
	$('.warp_bottom_reply').bind('init', function() {
		var that = $(this);
		$(this).data('basePath', (function() {
			var ev = $('script[src$="/js/editor.js"]');
			if (ev.size() > 0) {
				var src = ev.attr('src');
				return src.substring(0, src.lastIndexOf('/') - 3);
			}
			return '';
		})());
		
		if ($(that).data('basePath')  == '') {
			throw '抱歉,编辑器初始化失败。'; return;
		}
		
		(function() {
			if ($('script[src*="jquery.insertAtCaret.js"]').size() < 1) {
				var _src = $(that).data('basePath') + '/js/jquery.insertAtCaret.js';
				//$.getScript(_src, function() {
					$('head', document).eq(0).append('<script type="text/javascript" src="'+ _src +'"></script>');
				//});
			}
		})();
		
		$(document).bind('click', function(e) {
		//$(document).on('click', function() {
			var evs = $('.sdialog:not(.sdialog-window)');
			if (evs.size() < 1) {
				return;
			}
			
			var self = $(e.target);
			var that = self.is('.sdialog') ? self : self.closest('.sdialog');
			if (that.size() > 0) {
				evs.not(that).trigger('close'); return;
			}
			evs.trigger('close');
		});
		
		
		//插入图片
		$(this).bind('dialogPic', function(ev, dom, fn) {
			sDialog.endPopup(sDialog.popup({
				"id": sDialog.beforePopup('sDialog-upload-pic'),
				"width": '240px',
				"ev": $(dom),
				"html": [
					'<div class="sdialog-upload"><ul>',
					'<li class="from-local"><a href="#"></a></li>',
					'<li class="from-remote"><a href="#"></a></li>',
					'</ul></div>'
				].join(''),
				"init": function(ev) {
					var lis = $('.sdialog-upload ul li', ev);
					lis.filter('.from-local').bind('click', function() {
						that.trigger('dialogPicLocal', [function(data) {
							fn.call(this, data);
						}]);
						$(ev).trigger('close');
						return false;
					});
					
					lis.filter('.from-remote').bind('click', function() {
						that.trigger('dialogPicWeb', [function(data) {
							fn.call(this, data);
						}]);
						$(ev).trigger('close');
						return false;
					});
				}
			}));
		});
		
		//插入本地图片
		$(this).bind('dialogPicLocal', function(ev, fn) {
			sDialog.endCreate(sDialog.create({
				"id": sDialog.beforeCreate('sDialog-upload-pic-local'),
				"width": "680px",
				"title": '上传本地图片',
				"html": [
					'<div class="sdialog-upload-body">',
					'<div class="sdialog-upload-container">',
					'<ul>',
					'<li>',
					'<div class="sdialog-upload-add">',
					'<form method="post" enctype="multipart/form-data" action="'+ sEditorConfig.uploadJson +'"><input name="imgfile" type="file" title="添加图片" /></form>',
					'</div>',
					'</li>',
					'</ul>',
					'</div>',
					'</div>'
				].join(''),
				
				"init": function(ev) {
					if ($('script[src*="jquery.form.js"]').size() < 1) {
						var _src = $(that).data('basePath') + '/js/jquery.form.js';
						//$.getScript(_src, function() {
							$('head', document).eq(0).append('<script type="text/javascript" src="'+ _src +'"></script>');
						//});
					}
					
					var _ipt = $('.sdialog-upload-add :input[type="file"]', ev);
					_ipt.bind('change', function() {
						var _box = $('<li>').html('<a href="javascript:void(0)"><img src="'+ $(that).data('basePath') +'/images/editor/loading.gif" /><span title="移除">×</span></a>');
						$(this).closest('li').before(_box);
						$('span', _box).bind('click', function() {
							$(this).parent().parent().remove(); return false;
						});
						
						var _theform = $(this).closest('form');
						_theform.ajaxSubmit({
							"dataType": "jsonp",
							"success": function(json) {
								_theform.resetForm();
								if (json.status < 1) {
									sDialog.showMsg(json.msg);
									$('span', _box).trigger('click');
									return;
								}
								$('img', _box).attr('src', json.url).parent().attr({"href": json.url, "target": "_blank"});
							},
							"error": function(r, s, t) {
								sDialog.showMsg('抱歉上传失败'); $('span', _box).trigger('click');
							}
						});
					});
				},
				
				"callback": function(ev) {
					var result = [];
					$('.sdialog-upload-container ul li img', ev).each(function() {
						result.push($(this).attr('src'));
					});
					fn.call(this, result);
					$('.sdialog-upload-container ul li:not(:last)', ev).remove();
					$(ev).trigger('close');
				}
			}));
		});
		
		//插入网络图片
		$(this).bind('dialogPicWeb', function(ev, fn) {
			sDialog.endCreate(sDialog.create({
				"id": sDialog.beforeCreate('sDialog-upload-pic-web'),
				"width": "680px",
				"title": '插入网络图片',
				"html": [
					'<div class="sdialog-upload-body">',
					'<div class="sdialog-upload-head">',
					'<input type="text" value="" placeholder="请粘贴图片地址" class="sdialog-input-text" style="width:80%;" /> ',
					'<input type="button" value="添加" class="sdialog-button" /> ',
					'</div>',
					'<div class="sdialog-upload-container">',
					'<p>暂未添加图片</p>',
					'</div>',
					'</div>'
				].join(''),
				"init": function(ev) {
					$('.sdialog-upload-head .sdialog-button', ev).bind('click', function() {
						var _container = $('.sdialog-upload-container', ev);
						if ($('ul li', _container).size() < 1) {
							_container.html('<ul></ul>');
						}
						
						var _input = $(this).prev(':input');
						var _src = _input.val();
						if (!/^[\w-]{3,}:\/\/[\w-]+(\.[\w-]+)+(:\d{1,6})?\//.test(_src)) {
							sDialog.showMsg('抱歉,图片URL地址不正确。');
							_input.focus();
							return false;
						}
						
						var _box = $('<li>').html('<a href="'+ _src +'" target="_blank"><img src="'+ _src +'" /><span title="移除">×</span></a>');
						_box.appendTo($('ul', _container));
						_input.val('');//.focus();
						$('span', _box).bind('click', function() {
							$(this).parent().parent().remove(); return false;
						});
					});
				},
				
				"callback": function(ev) {
					var result = [];
					$('.sdialog-upload-container ul li img', ev).each(function() {
						result.push($(this).attr('src'));
					});
					fn.call(this, result);
					$('.sdialog-upload-container', ev).html('<p>暂未添加图片</p>');
					$(ev).trigger('close');
				}
			}));
		});
		
		//插入视频
		$(this).bind('dialogVideo', function(ev, dom, fn) {
			sDialog.endPopup(sDialog.popup({
				"id": sDialog.beforePopup('sDialog-video'),
				"width": '450px',
				"ev": $(dom),
				"html": [
					'<div class="sdialog-body">',
					'<p>',
					'<input type="text" value="" placeholder="请输入视频地址" class="sdialog-input-text sdialog-input-text-medium" /> ',
					'<input type="button" value="添加" class="sdialog-button" /> ',
					'</p>',
					'</div>'
				].join(''),
				"init": function(ev) {
					$('.sdialog-body :input.sdialog-button', ev).bind('click', function() {
						var _input = $('.sdialog-body :input.sdialog-input-text', ev);
						var _url = _input.val();
						if (!/^[\w-]{3,}:\/\/[\w-]+(\.[\w-]+)+(:\d{1,6})?\//.test(_url)) {
							sDialog.showMsg('抱歉,视频URL地址不正确。');
							_input.focus();
							return false;
						}
						fn.call(this, {"url": _url});
						_input.val('');
						$(ev).trigger('close');
					});
				}
			}));
		});
		
		//插入表情
		$(this).bind('dialogPhiz', function(ev, dom, fn) {
			var _htm  = ['<div class="sdialog-emoticons"><table width="100%" border="0" cellspacing="0" cellpadding="4">'];
			var x = 6, y = 9;
			var path = that.data('basePath') + '/images/editor/emoticons/';
			for (var i = 1; i <= x; i++) {
				_htm.push('<tr>');
				for (var j = 1; j <= y; j++) {
					_htm.push('<td><img src="'+ path + ((i - 1) * y + j) +'.gif" /></td>');
				}
				_htm.push('</tr>');
			}
			_htm.push('</table></div>');
			sDialog.endPopup(sDialog.popup({
				"id": sDialog.beforePopup('sDialog-phiz'),
				"width": "360px",
				"ev": $(dom),
				"html": _htm.join(''),
				"init": function(ev) {
					$('table tr td', ev).hover(function() {$(this).addClass('on');}, function() {$(this).removeClass();}).bind('click', function() {
						var src = $('img', this).attr('src');
						var b = src.lastIndexOf('/') + 1;
						var e = src.lastIndexOf('.');
						fn.call(this, {
							"value": src.substring(b, e)
						});
						$(ev).trigger('close');
					});
				}
			}));
		});
		
		//插入音频
		$(this).bind('dialogAudio', function(ev, dom, fn) {
			sDialog.endPopup(sDialog.popup({
				"id": sDialog.beforePopup('sDialog-audio'),
				"width": '450px',
				"ev": $(dom),
				"html": [
					'<div class="sdialog-body">',
					'<p>',
					'<input type="text" value="" placeholder="请输入音频地址" class="sdialog-input-text sdialog-input-text-medium" /> ',
					'<input type="button" value="添加" class="sdialog-button" /> ',
					'</p>',
					'</div>'
				].join(''),
				"init": function(ev) {
					$('.sdialog-body :input.sdialog-button', ev).bind('click', function() {
						var _input = $('.sdialog-body :input.sdialog-input-text', ev);
						var _url = _input.val();
						if (!/^[\w-]{3,}:\/\/[\w-]+(\.[\w-]+)+(:\d{1,6})?\//.test(_url)) {
							sDialog.showMsg('抱歉,音乐URL地址不正确。');
							_input.focus();
							return false;
						}
						
						fn.call(this, {"url": _url});
						_input.val('');
						$(ev).trigger('close');
					});
				}
			}));
		});
		
		//插入附件
		$(this).bind('dialogFile', function(ev, dom, fn) {
			sDialog.endPopup(sDialog.popup({
				"id": sDialog.beforePopup('sDialog-file'),
				"width": '450px',
				"ev": $(dom),
				"html": [
					'<div class="sdialog-body">',
					'<p>',
					'<input type="text" value="" placeholder="请输入附件地址" class="sdialog-input-text sdialog-input-text-medium" /> ',
					'<input type="button" value="添加" class="sdialog-button" /> ',
					'</p>',
					'</div>'
				].join(''),
				"init": function(ev) {
					$('.sdialog-body :input.sdialog-button', ev).bind('click', function() {
						var _input = $('.sdialog-body :input.sdialog-input-text', ev);
						var _url = _input.val();
						if (!/^[\w-]{3,}:\/\/[\w-]+(\.[\w-]+)+(:\d{1,6})?\//.test(_url)) {
							sDialog.showMsg('抱歉,附件URL地址不正确。');
							_input.focus();
							return false;
						}
						
						fn.call(this, {"url": _url});
						_input.val('');
						$(ev).trigger('close');
					});
				}
			}));
		});
		
		
		$('.out-left-0', this).each(function() {
			var _span = $('span.icon', this);
			
			//插入图片
			if (_span.is('.icon-pic')) {
				$(this).bind('click', function() {
					that.trigger('dialogPic', [$(this), function(data) {
						var _htm = [];
						$.each(data, function(k, url) {
							_htm.push(sUbb.compile.img(url));
						});
						$(sEditorConfig.selector, that).insertAtCaret(_htm.join(''));
					}]);
					return false;
				});
			}
			
			//插入视频
			else if (_span.is('.icon-video')) {
				$(this).bind('click', function() {
					that.trigger('dialogVideo', [this, function(data) {
						$(sEditorConfig.selector, that).insertAtCaret(sUbb.compile.video(data.url));
					}]);
					return false;
				});
			}
			
			//插入表情
			else if (_span.is('.icon-phiz')) {
				$(this).bind('click', function() {
					that.trigger('dialogPhiz', [$(this), function(data) {
						$(sEditorConfig.selector, that).insertAtCaret(sUbb.compile.emoticon(data.value));
					}]);
					return false;
				});
			}
			
			//插入音频
			else if (_span.is('.icon-audio')) {
				$(this).bind('click', function() {
					that.trigger('dialogAudio', [this, function(data) {
						$(sEditorConfig.selector, that).insertAtCaret(sUbb.compile.audio(data.url));
					}]);
					return false;
				});
			}
			
			//插入附件
			else if (_span.is('.icon-file')) {
				$(this).bind('click', function() {
					that.trigger('dialogFile', [this, function(data) {
						$(sEditorConfig.selector, that).insertAtCaret(sUbb.compile.file(data.url));
					}]);
					return false;
				});
			}
		});
		
	}).trigger('init');
});


请保留作者版权:优良子弟 QQ:1596948728

jqeditor-svn343.zip ################ ### 功能列表 ### ################ 1、系统功能: 加粗、斜体、下划线、删除线、左对齐、右对齐、中介对齐 增加缩进、减少缩进、有序列表、无序列表、下标、上标 2、基础功能: 字体、字号、撤销、重做、源码、删除格式、插入图片、表格、字体颜色、背景颜色 插入多媒体文件、链接、特殊符号 3、定制功能: 一级目录、二级目录、内链、参考资料、快捷菜单 4、其他功能: 异步加载、全屏编辑、右键菜单、地图 #################### ### 目录结构 ### #################### - src |- lang |- zh-cn.js |- en.js |- ... |- core.js |- icons.js |- mod |- mod.*.js |- plugin |- plugin.*.js - jqeditor.min.js - style |- spacer.gif |- icon_mce.gif |- content_default.css - skins |- mce.css #################### ### 要 求 ### #################### 1.代码结构要清晰,业务代码和逻辑分离,方便开发和维护; 2.方便扩展; 3.功能定制性强、满足多种需求; 4.兼容性好; 5.可以同时存在多个编辑器; 6.不常用的多个插件代码可以整合为一个文件,延迟加载, 不常用且代码量很多的个别插件可以在首次使用时加载, 7.增加编辑器事件机制,事件过程可以分为初始化阶段、编辑器加载完成阶段、命令触发时段等。 模块可以向各个时段注册需要执行的代码,通过此模式降低核心和模块的耦合度。 避免在核心代码但这直接调用模块代码, 如在核心方法中使用 E.mod('Panel').set() 等就是增加了耦合性。 8.模块、插件支持热插拔; #################### ### 代码组织方式 ### #################### 代码主要指js代码,大致分三部分:核心、模块、插件,核心文件是一个core.js, 为了方便开发和维护,每个模块或插件都是一个独立的js文件。 核心:编辑器框架,不包含具体功能,所有功能通过模块或插件形式进行扩展; 模块:会重复使用的功能,不会对应具体的按钮; 插件:唯一功能 #################### ###  开发计划  ### #################### 1、核心框架 core.js 2、主要模块 E.mod("Confirm") E.mod("Panel") E.mod("History") E.mod("Event") E.mod("Toolbar") E.mod("Data") E.mod("Selection") ... 3、主要插件 Redo, Undo Font Image Link ForeColor,BackColor Source,PasteText PasteWord Save AutoHeight ... #################### ###  开发插件  ### #################### 开发插件是相当简单的事情,插件分为有界面插件和无界面插件,无界面的插件会更简单一些,如撤销、重做、表格操作等插件。 1、无界面插件,以plugin.history.js为例,仅需要一个click方法即可 (function(E){ var Consts = E.consts; E.plugin("Redo,Undo", { click: function( Panel, self, target ){ var name = self.name, History=E.mod("History"); if (History){ History[name]( ); }else{ E.execCommand(name); } return 1; } }); })(jQEditor); 2、有界面插件,以plugin.link.js为例 /** * 超链接插件 * 请注意插件会继承 Base_Plugin 的属性,在core.js当中定义,界面插件需要设置config属性、init方法、get方法。 */ (function(E){ var Consts = E.consts; E.plugin("Link", { config: { //面板宽度 width:320 }, init: function( self ){ //fill="Selection" //指定此属性后,会自动将编辑器中选中的文字赋值到此文本框 self.cache['html'] = 'html.....'; }, /** * 返回要插入到编辑器的html代码 */ get: function( panel, self ){ var v = self.getValues( panel ), html=''; if( v.text && v.url ){ html = '<a href="'+v.url+'" target="'+v.target+'">'+v.text+'</a>'; }else if( !v.text ){ self.error( '请输入超链接文字' ); }else if( !v.url ){ self.error( '请输入超链接网址' ); } return html } }); })(jQEditor);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值