[原文×××]
摘要
在本文中,Haissam Abdul Malak将给大家详细介绍如何使用javascript开发一个HTML在线编辑器,它可以应用于web应用程序中,特别是论坛,社区和博客。这个编辑器支持基于XHTML创建文本的功能。
原文发布日期:2007.01.04
作者:Haissam Abdul Malak
翻译:webabcd
文章内容
介绍
我的一个朋友在一个正在开发的项目(一个博客网站)中遇到了一些问题,是关于文本编辑器的。在研究了所有免费的编辑器之后,他发现没有一个是他所需要的,所以我接下了这个任务,帮他开发一个HTML在线编辑器的用户控件,我认为和大家分享这个控件是个好主意,达到了知识共享的目的。
这个编辑器包括如下一些特性
1、工具栏包括了全部的功能(下面已列出)
·排列(居左,居中,居右)
·字体格式(加粗,下划线,斜体,字号,字体,文字颜色)
·计算单词数,删除格式,插入水平线,撤销,重复,插入字符
2、HTML模式结合到了一个框架中,文本模式结合到了另一个框架中。注意这两个框架只能有一个被显示。
3、有两个图标,分别是“HTML视图”和“设计模式”,一个文本框用来显示单词数,最后有两个隐藏文本框用来存储用户输入的数据。
要看懂这个实例,你需要有javascript和HTML的相关知识。
在用户控件中添加HTML代码
这部分我们将创建一个用户控件(hamHtmlEditor.ascx),并且在其中写一些必需的HTML代码。注意该用户控件不包含<head>, <body> 或 <form> 标记。
我们将创建3个表格来显示所有的图标,另外还要有3个下拉列表框。其中2个表格放在控件的顶端,1个表格放在控件的底部。每个图标都有3个事件,分别是onmouseover,onmouseup,onclick,处理这些事件的是javascript文件中的javascript代码。把javascript代码和HTML代码分开,可以让你更容易理解和调试。然后我们将创建3个层,第一个层包含一个已经有的HTML页(TextArea.htm)。我使用一个HTML页是因为如果用户输入了一个rul,它可以自动的把它转换为HTML代码并呈现在你的文本中。第二个层包括了1个textarea,在用户使用期间,它用来显示HTML代码(默认隐藏)。第3个层包含了一些符号,当用户点击“插入符号”后,这个层将被现实(默认隐藏)。
为了使用户能够输入文字,你必须在控件被使用的时候,将其设置为“设计模式”
列表1
请下载这个项目以知道如何正确的创建所有的HTML标记
图1
这部分我们将写一些处理用户事件的函数。首先,我们将定义一些全局变量,其中每一个变量都有自己的功能,但最多的是用来存储图标在被单击之前或者默认的值—“No”。只有一个变量有另一个功能,这个变量是sourceText,它用来存储用户输入的文本。
列表2
var imgStatusBold = 'No';
var imgStatusItalic = 'No';
var imgStatusUnderLine = 'No';
var imgStatusLeft = 'No';
var imgStatusCenter = 'No';
var imgStatusRight = 'No';
var imgStatusRemoveF= 'No';
var imgStatusWCount = 'No';
var imgStatusInsertL = 'No';
有三个功能分别被称作onmouseover,onmouseup,和onclick。Onmouseover触发函数ChangeImg(),作用是当用户把鼠标放到图标上则改变所显示的图标的状态,这个函数需要两个参数(容器ID和新图标路径)。注意工具栏上的图标在web应用程序中被放置到“Images”文件夹下。
列表3
{
var imgSrc = "Images/" + imgsrc;
document.getElementById(id).src = imgSrc;
}
列表4
{
if(ownVar == 'No')
{
var imgSrc = "Images/" + imgsrc;
document.getElementById(id).src = imgSrc;
}
}
单击图标后执行一个指定的动作,一个单独的javascript方法被调用,每一个动作都有标准的写法。
列表5
列表6
{
var img = document.getElementById('Bold')
var imgBold = "Images/" + boldover
var imgNotBold = "Images/" + bold
img.src = imgBold;
if(imgStatusBold == 'Yes')
{
imgStatusBold='No';
img.src = "Images/" + bold;
}
else
{
imgStatusBold= 'Yes'
}
document.frames['HamHtmlEditor1_content'].document.execCommand('bold',false,null);
document.frames['HamHtmlEditor1_content'].focus();
}
对文字进行排列,我们使用与MakeBold()相似的函数,但是,3个排列功能的按钮只能有一个是被选中状态,其它两个要变为初始的未被选中的状态。
为了完成上面指出的那个execCommand命令,请参考
http://www.course.com/downloads/newperspectives/crweb3/documents/dhtml_t02.html
现在我们创建一个计算用户输入的单词数的函数。定义一个变量,默认值为0。在定义另一个变量用来存储用户输入的文本,我们将拆开这个变量,并且将拆开的结果保存到一个数组中,然后检查数组内每个元素的长度,如果是零则不计数,如果不是零则计数变量加1。计数完后,我们把该值赋给用于显示计数的文本框。
列表7
var count = 0;
countWithSpace = wordCount.replace('\n', '');
countWithoutSpaces = countWithSpace.split(' ');
for(i=0;i<countWithoutSpaces.length;i++)
{
if(countWithoutSpaces[i].length>0)
{
count +=1;
}
window.parent.document.getElementById('HamHtmlEditor1_TxtCount').value = count;
}
如果想删除某些已经有格式的文本的格式,这个功能将是非常有用的。
列表8
{
document.frames['HamHtmlEditor1_content'].document.execCommand('RemoveFormat');
document.frames['HamHtmlEditor1_content'].focus();
}
列表9
{
document.frames['HamHtmlEditor1_content'].document.execCommand(style);
document.frames['HamHtmlEditor1_content'].focus();
}
列表10
{
var div = document.getElementById(p_w_picpaths);
if(div.style.display == 'block')
div.style.display = 'none';
else
div.style.display = 'block';
}
图2:用户单击“插入符号”后,编辑器的外观
列表11
{
document.getElementById(p_w_picpaths).style.display = 'none'
document.frames['HamHtmlEditor1_content'].focus();
HamHtmlEditor1_content.document.execCommand(style,'',url)
document.frames['HamHtmlEditor1_content'].focus();
}
列表12
{
document.getElementById('HamHtmlEditor1_Div2').style.display = 'block';
document.getElementById('HamHtmlEditor1_Div2').innerText =
document.frames['HamHtmlEditor1_content'].document.body.innerHTML;
}
列表13
{
document.getElementById('HamHtmlEditor1_Div2').style.display = 'none';
}
第一个是字号,尺寸在1(10pt)到7(22pt)之间。这个按钮被单击后,要调用一段javascript函数。这个函数获得用户在下拉列表里选择的值,然后作为第三个参数发送给execCommand。第一个参数是“FontSize”,用来执行设置文字大小的命令。注意,下拉列表中的字号大小是预先在用户控件中的HTML代码里定义好的。
列表14
{
var fontSize = document.getElementById('FontDropDownonchange');
document.frames['HamHtmlEditor1_content'].document.execCommand('FontSize',0,fontSize.options[fontSize.selectedIndex].text);
document.frames['HamHtmlEditor1_content'].focus();
}