七月
26

为评论框添加文字格式化编辑器

下午快下班时昏昏欲睡,在浏览一论坛时忽然看到输入框上的编辑器,于是精神一振,花了一个小时也给博客加入了这个功能。

之前有过这样的想法,并且上网找过这方面的代码,貌似很多人用的是一款焦作quicktags什么的编辑器。但是这个太大,足足快20KB了,实在是太臃肿了。

所以我就自己写了。代码也不多,顺便也把表情添加和这个整合到一起了。当然,功能上也许就没quicktags全面了。

其实JavaScript代码不难写,难点主要在与体验方面,比如鼠标光标的位置,对于选择的字符的处理以及处理后光标返回的位置。

我的代码遵寻以下几点效果:

  1. 对于普通的加粗(<strong>)、倾斜(<em>)等,如果鼠标没有选择文字,则直接在光标位置处加上完整闭合的标签。然后光标定位到标签中间,方便直接在标签中写入文字。
  2. 对于用鼠标选择了一段文字的,则在原位置返回经过格式化后的文字。然后光标定位到闭合标签后面。
  3. 链接、图片则需要在弹出窗口中输入相应的链接地址及alt等。

我定义了一个插入编辑器的函数,有三个参数,前两个必须,最后一个etag可选(比如img就没有后半部标签):

   1: /**
   2: 
   3: * @return void
   4: 
   5: * @param myField 输入框对象
   6: 
   7: * @param ftag 标签前半部分,如<strong>
   8: 
   9: * @param etag 标签后半部分,如</strong>
  10: 
  11: */
  12:  
  13: function addEditor(myField,ftag,etag){
  14:  
  15:     if (document.selection) {
  16:  
  17:         myField.focus();
  18:  
  19:         sel = document.selection.createRange();
  20:  
  21:         etag ? sel.text = ftag + sel.text + etag : sel.text = ftag;
  22:  
  23:         myField.focus();
  24:  
  25:     } else if (myField.selectionStart || myField.selectionStart == '0') {
  26:  
  27:         var startPos = myField.selectionStart;
  28:  
  29:         var endPos = myField.selectionEnd;
  30:  
  31:         var cursorPos = endPos;
  32:  
  33:         etag ? myField.value = myField.value.substring(0, startPos) + ftag + myField.value.substring(startPos, endPos) + etag + myField.value.substring(endPos, myField.value.length) : myField.value = myField.value.substring(0, startPos) + ftag + myField.value.substring(endPos, myField.value.length);
  34:  
  35:         etag ? cursorPos += ftag.length + etag.length : cursorPos += ftag.length - endPos + startPos;
  36:  
  37:         if(startPos == endPos && etag)cursorPos -= etag.length;
  38:  
  39:         myField.focus();
  40:  
  41:         myField.selectionStart = cursorPos;
  42:  
  43:         myField.selectionEnd = cursorPos
  44:  
  45:     } else {
  46:  
  47:         myField.value += ftag + etag;
  48:  
  49:         myField.focus();
  50:  
  51:     }
  52:  
  53: }
  54:  
  55: //函数部分没有注释,我想也很少有人会去添加这个功能,更别说想去弄懂代码意思吧。有人问的时候我再解释吧。
  56:  

接下来还要有每个插入相应标签的函数,我就举几个例子吧

   1: var myField=document.getElementById('comment')||0;
   2:  
   3: var Editor={
   4:  
   5:     strong:function(){
   6:  
   7:         addEditor(myField,'<strong>','</strong>');//直接调用前后标签
   8:  
   9:     },
  10:  
  11:     ahref:function(){
  12:  
  13:         var URL = prompt('Enter the URL' ,'http://');//先获取输入的url地址
  14:  
  15:         if (URL) {
  16:  
  17:             addEditor(myField,'<a target="_blank" href="' + URL + '" rel="external">','</a>');
  18:  
  19:         }
  20:  
  21:     },
  22:  
  23:     img:function(){
  24:  
  25:         var myValue = prompt('Enter the URL of the image', 'http://');//获取图像地址
  26:  
  27:         if (myValue) {
  28:  
  29:             myValue = '<img src="' 
  30:  
  31:                     + myValue 
  32:  
  33:                     + '" alt="' + prompt('Enter a description of the image', '') //再取得alt值
  34:  
  35:                     + '" />';
  36:  
  37:             addEditor(myField,myValue);//这里没有第三个参数了
  38:  
  39:         }
  40:  
  41:     }
  42:  
  43: }
  44:  

然后就可在评论框附近调用了,样式自己根据自己博客主题定义。

   1: <a class="em" title="EM Font" href="javascript:Editor.em();">EM</a>//调用加入em标签
   2:  
   3: <a class="ahref" title="Add Link" href="javascript:Editor.ahref();">ahrefa</a>//插入a链接
   4:  
   5: <a class="imgadd" title="Add a Image" href="javascript:Editor.img();">img</a>//插入图像
   6:  

大家可以在我评论框上试试, 可以用鼠标选择一段文字,再加上标签,或者直接添加标签,注意观察标签加入后光标的位置。如有bug,请及时告知于我。

注意,那个小扫帚是个格式清除,你可以选择一段需要去除格式的文字,再点一下小扫帚就可以去格式化了。

PS:我的编辑器上还有文字颜色、文字大小的处理,是因为我急着下班,忽略了<span>标签会被过滤掉,只顾一股脑赶紧都添加好下班。暂时现在也不想去掉了,以后想想还有什么标签要添加,直接替换一下就好了。

另外,有心的同学应该也注意到了,评论框右上方还有两个编辑按钮,一个是字数统计,一个是清空文字输入框,这两个功能很无意思,所以就不多说了,呵呵。不过字数统计统计的是去除html标签后的文字长度,与提交按钮右边的字符统计不同。

qw

本文标签: , , , ,

分享

本文短网址: http://qiqi.boy.im/5l

这篇文章已经有 116 条评论

Comments (109) Trackbacks (7)
You can leave a response or Trackback this entry .
  1. wtwteteryery -#41

    :shock:

  2. divachen -#42

    插~!我主题很复杂看来也用不了,很早就想要这功能,但是有不想安装插件。
    所以请你帮忙看看 http://www.indetime.com 这主题咋个修改法。谢谢~!

  3. Bob -#43

    不会加啊,请问这几段代码怎么加啊,哎,太弱了……

  4. mybg -#44

    能不能把编辑器的图片以及你现在定义的标签全发出来呢?比如添加表情、清除格式、清空输入框这几个,我不知道怎么定义。。。谢谢!

  5. 金冈 -#45

    的
    测试下

  6. sking -#46

    ddd

  1. 【多彩的评论】:让评论可以插入图片,更改文字大小、颜色

    [...] @QiQiBoY 额,要不你就用[img]标签吧 ~ 写一个函数在输出显示的时候替换为《img标签 [...]

  2. 让你的评论框自由粘贴代码

    [...] 前两天我写过一篇《为评论框添加文字格式化编辑器 》,其中zwwoOoOo在留言中说希望有一种可以转换“<”为html实体符号的方法,所以我给了他一段可以将选中的文字中的“<”转换为“<”的js代码。 [...]

  3. 博客加入若干Ajax效果

    [...] 为评论框添加文字格式化编辑器 [...]

  4. Hello WordPress!

    [...] 2010.07 我开始爆发了,我折腾了很多,首先是wordpress无限嵌套的完美解决WordPress嵌套回复的层深问题(无限嵌套)<一>,还有如何通过JS自动处理文中的图片宽高,这个方法我一直在用哦:我是如何处理文章中图片的。想知道我评论框的那么多功能从哪里来的么,你看完这些你也能拥有和我评论框一样强大的功能了:评论框的简单计数器(无需改动模板,附带输入字数限制功能),添加引用按钮——轻松打造属于你的WordPress引用回复功能、为评论框添加文字格式化编辑器、【多彩的评论】:让评论可以插入图片,更改文字大小、颜色、让你的评论框自由粘贴代码、修正关于Ajax comments的一个小问题。还有关于如何创建邮件表单页面的创建一个可设置cookie相关信息的内置Email联系表单;如果你也想要知道wordpress不同页面显示不同的评论数以及楼层的显示,那么这篇文章也许会给你帮助wordpress指定页面评论数+支持分页的楼层显示 [...]

  5. 增强 WordPress 评论功能,提高访客体验

    [...] 很多论坛的回复框都带有简易编辑器,在博客评论框也加上会带来方便吧。 根据 qiqiboy 的这篇:为评论框添加文字格式化编辑器,先来加上几个常用的标签。 [...]

  6. 为评论框添加简单文字编辑器 / IM路人

    [...] qiqiboy 的相关介绍文章 传送 » 转载请注明来源 » IM路人 » [...]

  7. 留言评论简易编辑器

    [...] 推荐qiqiboy的《为评论框添加文字格式化编辑器》。 2011-04-05 · WP Trick 1 条评论 · Ben 转载请遵循BY-NC-SA协议 [...]

Leave a Reply

Hi , say something.

  • :?:
  • :razz:
  • :sad:
  • :evil:
  • :!:
  • :smile:
  • :oops:
  • :grin:
  • :eek:
  • :shock:
  • :???:
  • :cool:
  • :lol:
  • :mad:
  • :twisted:
  • :roll:
  • :wink:
  • :idea:
  • :arrow:
  • :neutral:
  • :cry:
  • :mrgreen: