七月
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

这篇文章已经有 120 条评论

Comments (111) Trackbacks (9)
You can leave a response or Trackback this entry .
  1. 老张博客 -#21

    这样做是方便呀。。。。。

  2. 小闇 -#22

    小白來發問了 :sad:
    頭兩道代碼是不是放在comments.php裡的?

  3. mybg -#23

    请问在typecho里应该怎么加呢?

    • QiQiBoY --#1

      @mybg
      都一样的,函数部分在页面任一位置引入,调用部分加在评论框附近。。。
      具体的我没接触过typecho,不清楚其结构。。。

    • mybg --#2

      我是个菜鸟,好像没弄对。

  4. 第六空间 -#24

    这个值得收藏,暂时还不想动手。添加到收藏夹先

  5. Ben -#25

    找了很久总算找到了!都是DZ论坛的编辑器~ :grin:

    • QiQiBoY --#1

      @Ben
      准确的说,都是DZ的编辑器图标 :smile:

    • Ben --#2

      @QiQiBoY
      如果点击后的弹出方式能和DZ一样就更好了。
      :grin: 其实我比较期待做成插件……

    • QiQiBoY --#3

      @Ben
      类似插件其实已经很多了,甚至包括更为强大的所见即所得式编辑器。。。我正是为了简化才写了这么个简单的。。

  6. chnmcy -#26

    [color=#443333]这个好
    我也要加
    再来学习[/color]

  7. chnmcy -#27

    唉字体颜色变吗

  8. bigworld -#28

    颜色在变吗?

  9. bigworld -#29

    颜色不起作用啊

  10. bigworld -#30

    灰色的可以了 试试红色的

  11. 柳城 -#31

    试一下代码。。 :grin:

    while(){
    $data=;
    for($i=1;$ichr$i.txt”)||die “$!”;
    if($data>=100 and $data1000 and $data<=10000){
    print;
    }else{
    next;
    }
    }
    }

  12. 柳城 -#32

    依然还是没有代码空格啊。郁闷。。

    • liuqiqi --#1

      @柳城
      这个不是代码格式化,是文字格式化,是指给文字加上“加粗”、“颜色”。。等等的功能。。。

  13. sam -#33

    强大,不过我觉得插入图片这个就免了.这样请求数就增加了而且在评论里加个表情已经足够生动的说明一些对话了.不过这还是个人爱好的,自己写强大呀.

    • QiQiBoY --#1

      @sam
      评论中图片和你在文章中插入的图片一样的。。也和表情一样的,你说多一个请求,也只是多一个图片请求,和你=添加一个表情是一样的。。。可能增加的也就是服务器端对标签的一次转换,可以忽略

  14. 奚少 -#34

    我只想使用其中的一点功能,就是当鼠标点击留言框的时候,才显示上边的一行,请问QiQiBoY我该如何实现?我对你上边的代码看不懂,嘿嘿…

  15. sky -#35

    哈哈,测试一下,fckeditor编辑器也可以实现,不过没有你这个效果好,哈哈

  16. mopvhs -#36

    泪流满面,复制下来的代码有行号…qiqi竟然这样贴代码,只能用正则删行号了吗~~ :cry:

  17. idong -#37

    小白提问,这些代码怎么用?放哪个文件里? 为什么我弄完后还是不能显示图片

  18. wtwteteryery -#38

    评论分页: « 上一页 1 2

  19. wtwteteryery -#39

    评论分页: « 上一页 1 2
    响应超时,请求取消!!请稍后再试!

  20. wtwteteryery -#40

    :eek:

  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协议 [...]

  8. 一、php的写入 在P…

    [...] 2、另外有一篇更详细的教程。 [...]

  9. 【转载】【折腾】给Typecho评论加个编辑器

    [...] 以前为了方便自己的回复,在评论区加了个编辑器,采用的是 功能:评论区增加编辑器这个文中的方法,当时这个quicktags.js有8kb,在看到了qiqiboy的这个文字编辑器 后,很漂亮。试过加上,但没成功。前段时间再次折腾后,成功加到了自己的博客上了,这个js只有4kb,比之前的小多了。所以,我也就换上了这个美观的文字编辑器,详细折腾步骤请查看全文了解。另外,求解: [...]

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: