转自:http://huqilong.blog.51cto.com/53638/115479
最近做社区,产品认准了开心网的编辑器,但是那个笔记其用到prototype框架,而我们使用的jquery-1.2.2.js,两者有冲突,于是一狠心,查了查资料,用了两天时间写了一个.
刚开始查的资料,在线编辑器的原理大概如下:
一、基于textarea 特点:简单,但是表情只能通过ubb进行控制,不能所见即所得
二、基于div 特点:简单,所见即所得,比较复杂,但是兼容性不好,js不易控制.
三、基于iframe,具有以上两者的优点,没有以上两者的缺点
那就用第三种了.
附件中是实现的东西,本人js面向对象这块不是很熟悉,高人可以修改指点下,别忘了留言啊,可以的话给我也发一份:huqilong@126.com
整个编辑器就一个js文件,大概不到200行js代码吧,如果需要 加粗、图片等功能,只要看下里面的另外一个文件即可。
特点:实现了“开心网”编辑器所有功能
代码量极少:101行js代码 js+css总共4k
引用简单:两句代码搞定
支持一个页面多个文本框应用
面向对象的js封装
简洁,无多余功能
扩展简单:想要其他功能可以很easy地添加
支持IE6、firefox、iE7
源码下载
使用方法如下:
效果图:
js代码
var face_head = " images/ " ;
var face_tail = " .gif " ;
function checkBrowserType()
{
var app = navigator.appName;
if (app.indexOf( ' Microsoft ' ) != - 1 ) {
return 0 ;
}
if (app.indexOf( ' Netscape ' ) != - 1 ) {
return 1 ;
}
}
function EasyEditor(editorId){
this .editorId = editorId;
}
EasyEditor.prototype = {
addFaceSelector: function (){
var face_selector_div = " <div><img src=\ "" +face_head+ " ec_1 " +face_tail+ " \ " id=\ " faceSelector_ " +this.editorId+ " \ " /></div> " ;
document.write(face_selector_div);
this .faceSelector = document.getElementById( " faceSelector_ " + this .editorId);
},
addFaceImageDiv: function (){
var facesDiv = " <div id=\ " facesDiv_ " +this.editorId+ " \ " class=\ " faceDiv\ " > " ;
for ( var i = 1 ;i <= face_count;i ++ ){
var _img = " <img src=\ "" +face_head+i+face_tail+ " \ " id=\ " face_image_ " +this.editorId+ " _ " +i+ " \ " class=\ " facesImg\ " /> " ;
facesDiv += _img;
}
facesDiv += " </div> " ;
document.write(facesDiv);
this .facesDiv = document.getElementById( " facesDiv_ " + this .editorId);
},
addFrame: function (){
var frameId = " frame_ " + this .editorId;
var frameString = " <iframe frameborder=\ " 0 \ " scrolling=\ " auto;\ " marginwidth=\ " 0 \ " id=\ "" +frameId+ " \ " class=\ " editorFrame\ " ></iframe> " ;
document.write(frameString);
this .frame = document.getElementById(frameId);
this .editorArea = this .frame.contentWindow;
this .editorArea.document.designMode = " on " ;
this .editorArea.document.contentEditable = true ;
this .editorArea.document.open();
this .editorArea.document.writeln( ' <html><head> ' );
this .editorArea.document.writeln( " <style>body{cursor:text;background: #ffffff; margin:1px; padding:1px; font-size:14px; overflow:auto;word-wrap: break-word; font-family: Arial, \ " 宋体\ " ;} p {padding: 0px; margin: 0px;}</style> " );
this .editorArea.document.writeln( ' </head> ' );
this .editorArea.document.writeln( ' <body> </body> ' );
this .editorArea.document.writeln( ' </html> ' );
this .editorArea.document.close();
},
attachFaceAction: function (){
for ( var i = 1 ;i <= face_count;i ++ ){
var imgObj = document.getElementById( " face_image_ " + this .editorId + " _ " + i);
imgObj.insertFace = this .insertFace;
imgObj.insertHtml = this .insertHtml;
imgObj.editorArea = this .editorArea;
imgObj.setup = this .setup;
imgObj.facesDiv = this .facesDiv;
imgObj.onmouseover = function (){ this .style.cursor = " pointer " ; this .style.border = " 1px solid #D01E3B " ;};
imgObj.onmouseout = function (){ this .style.border = " 1px solid #CCCCCC " ;};
imgObj.onclick = function (){ this .insertFace( this .src); this .facesDiv.style.display = " none " ;};
}
},
setup: function (command,content){
this .editorArea.focus();
this .editorArea.document.execCommand(command, false , content);
},
insertHtml: function (content){
if (checkBrowserType() == 0 ){
this .editorArea.focus();
this .editorArea.document.selection.createRange().pasteHTML(content);
} else {
this .setup( " insertHTML " ,content);
}
},
getHtml: function (){
return this .editorArea.document.body.innerHTML;
},
insertFace: function (imgPath){
var htmlContent = " <img src=\ "" +imgPath+ " \ " ></img> " ;
this .insertHtml(htmlContent);
},
keyPress: function (){
alert( " test " );
var ev = this .editorArea.event;
if (ev.keyCode == 13 ){
this .insertHtml( " <br/> " );
return false ;
}
return true ;
},
init: function (){
this .addFaceSelector();
this .addFaceImageDiv();
this .addFrame();
this .attachFaceAction();
this .faceSelector.facesDiv = this .facesDiv;
this .faceSelector.onmouseover = function (){ this .style.cursor = " pointer " ;};
this .faceSelector.onclick = function (){ var divStyle = this .facesDiv.style;divStyle.display == " block " ? divStyle.display = " none " :divStyle.display = " block " ;};
}
}
html代码:
< head >
< link href ="editor.css" type ="text/css" rel ="stylesheet" >
< script language ="javascript" src ="editor.js" ></ script >
< script language ='javascript' >
function test()
{
alert( editor.getHtml());
}
</ script >
</ head >
< body >
< script language ="javascript" >
var editor = new EasyEditor( " editor1 " );
editor.init();
</ script >
< br />
< br />
< input type ="button" value ="测试" id ="test" onclick ='test();' />
</ body >
</ html >
=====================================================================
改进篇
var face_head = " images/ " ;
var face_tail = " .gif " ;
function checkBrowserType()
{
var app = navigator.appName;
if (app.indexOf( ' Microsoft ' ) != - 1 ) {
return 0 ;
}
if (app.indexOf( ' Netscape ' ) != - 1 ) {
return 1 ;
}
}
function EasyEditor(editorId){
this .editorId = editorId;
this .container = document.getElementById( this .editorId);
}
EasyEditor.prototype = {
addFaceSelector: function (){
var selectorContainer = document.createElement( " div " );
var selectorImg = document.createElement( " img " );
selectorImg.src = face_head + " ec_1 " + face_tail;
selectorImg.id = " faceSelector_ " + this .editorId;
selectorContainer.appendChild(selectorImg);
this .container.appendChild(selectorContainer);
this .faceSelector = document.getElementById( " faceSelector_ " + this .editorId);
},
addFaceImageDiv: function (){
var facesDiv = document.createElement( " div " );
facesDiv.id = " facesDiv_ " + this .editorId;
facesDiv.className = " faceDiv " ;
for ( var i = 1 ;i <= face_count;i ++ ){
var faceImg = document.createElement( " img " );
faceImg.src = face_head + i + face_tail;
faceImg.id = " face_image_ " + this .editorId + " _ " + i;
faceImg.className = " facesImg " ;
facesDiv.appendChild(faceImg);
this .container.appendChild(facesDiv);
}
this .facesDiv = document.getElementById( " facesDiv_ " + this .editorId);
},
addFrame: function (){
var frame = document.createElement( " iframe " );
frame.id = " frame_ " + this .editorId;
frame.frameborder = " 0 " ;
frame.scrolling = " auto " ;
frame.marginwidth = " 0 " ;
frame.id = " frameId_ " + this .editorId;
frame.className = " editorFrame " ;
this .container.appendChild(frame);
this .frame = document.getElementById(frame.id);
this .editorArea = this .frame.contentWindow;
this .editorArea.document.designMode = " on " ;
this .editorArea.document.contentEditable = true ;
this .editorArea.document.open();
this .editorArea.document.writeln( ' <html><head> ' );
this .editorArea.document.writeln( " <style>body{cursor:text;background: #ffffff;height:12px; margin:1px; padding:1px; font-size:14px; overflow:auto;word-wrap: break-word; font-family: Arial, \ " 宋体\ " ;} p {padding: 0px; margin: 0px;}</style> " );
this .editorArea.document.writeln( ' </head> ' );
this .editorArea.document.writeln( ' <body> </body> ' );
this .editorArea.document.writeln( ' </html> ' );
this .editorArea.document.close();
},
attachFaceAction: function (){
for ( var i = 1 ;i <= face_count;i ++ ){
var imgObj = document.getElementById( " face_image_ " + this .editorId + " _ " + i);
imgObj.insertFace = this .insertFace;
imgObj.insertHtml = this .insertHtml;
imgObj.editorArea = this .editorArea;
imgObj.setup = this .setup;
imgObj.facesDiv = this .facesDiv;
imgObj.onmouseover = function (){ this .style.cursor = " pointer " ; this .style.border = " 1px solid #D01E3B " ;};
imgObj.onmouseout = function (){ this .style.border = " 1px solid #CCCCCC " ;};
imgObj.onclick = function (){ this .insertFace( this .src); this .facesDiv.style.display = " none " ;};
}
},
setup: function (command,content){
this .editorArea.focus();
this .editorArea.document.execCommand(command, false , content);
},
insertHtml: function (content){
if (checkBrowserType() == 0 ){
this .editorArea.focus();
this .editorArea.document.selection.createRange().pasteHTML(content);
} else {
this .setup( " insertHTML " ,content);
}
},
getHtml: function (){
return this .editorArea.document.body.innerHTML;
},
insertFace: function (imgPath){
var htmlContent = " <img src=\ "" +imgPath+ " \ " ></img> " ;
this .insertHtml(htmlContent);
},
keyPress: function (){
alert( " test " );
var ev = this .editorArea.event;
if (ev.keyCode == 13 ){
this .insertHtml( " <br/> " );
return false ;
}
return true ;
},
init: function (){
this .addFaceSelector();
this .addFaceImageDiv();
this .addFrame();
this .attachFaceAction();
this .faceSelector.facesDiv = this .facesDiv;
this .faceSelector.onmouseover = function (){ this .style.cursor = " pointer " ;};
this .faceSelector.onclick = function (){ var divStyle = this .facesDiv.style;divStyle.display == " block " ? divStyle.display = " none " :divStyle.display = " block " ;};
}
}
html代码:
< head >
< link href ="editor.css" type ="text/css" rel ="stylesheet" >
< script language ="javascript" src ="editor.js" ></ script >
</ head >
< body >
< br />
< div id ="testDiv" style ="background-color:red;" ></ div >
</ body >
</ html >
< script language ="javascript" >
var editor = new EasyEditor( " testDiv " );
editor.init();
function getHtml(){
alert(editor.getHtml());
}
</ script >
< a href ="#" onclick ="getHtml();" > 取值 </ a >